Ios 手动模式segue不工作,视图控制器不在窗口层次结构中?
我已经搜索了几个小时的网页和堆栈溢出,我无法解决这个问题。希望你们都能看到我的错误,因为我就是找不到 我有一个简单的基于故事板的应用程序,我刚刚开始。初始ViewController是UITabBarController的一个实例,具有模板中的两个虚拟ViewController。启动后,我需要检查设备是否登录到外部服务。如果没有,我将显示一个允许用户进行身份验证的模式ViewController,如果设备经过身份验证,那么我将只显示FirstViewController 以下步骤是我创建项目以来所做的一切:Ios 手动模式segue不工作,视图控制器不在窗口层次结构中?,ios,ios5,ios6,uistoryboard,uistoryboardsegue,Ios,Ios5,Ios6,Uistoryboard,Uistoryboardsegue,我已经搜索了几个小时的网页和堆栈溢出,我无法解决这个问题。希望你们都能看到我的错误,因为我就是找不到 我有一个简单的基于故事板的应用程序,我刚刚开始。初始ViewController是UITabBarController的一个实例,具有模板中的两个虚拟ViewController。启动后,我需要检查设备是否登录到外部服务。如果没有,我将显示一个允许用户进行身份验证的模式ViewController,如果设备经过身份验证,那么我将只显示FirstViewController 以下步骤是我创建项目以
viewDidLoad
手动调用segueWarning: Attempt to present <AuthenticateViewController: 0x83c0c10> on <EPTabBarController: 0x83be600> whose view is not in the window hierarchy!
问题在里面
- (void)viewDidLoad
{
[super viewDidLoad];
[self performSegueWithIdentifier:@"authenticationSegue" sender:self];
}
您正试图显示另一个视图(AuthenticateViewController
),而当前视图(EPTabBarController
)尚未加载到窗口层次结构中
因此,首先让您的EPTabBarController
加载到窗口层次结构中,然后呈现AuthenticateViewController
试试这个
- (void)viewDidLoad
{
[super viewDidLoad];
[self performSelector:@selector(loadAuthenticateViewController)
withObject:nil
afterDelay:1.0];
}
-(void)loadAuthenticateViewController
{
[self performSegueWithIdentifier:@"authenticationSegue" sender:self];
}
当你真的想控制局面时,可以这样做:
@implementation UeInitialisationViewController
BOOL didLoad;
BOOL wantPush;
- (id)init {
self = [super init];
if (self) { didLoad = NO; wantPush = NO; }
return self;
}
- (void)viewDidLoad {
[super viewDidLoad];
didLoad = YES;
if (wantPush == YES)
[self performSelector:@selector(pushToMainView)
withObject:nil afterDelay:0.0001];
}
- (void)pushToMainView {
if (didLoad == YES)
[self performSegueWithIdentifier:@"pushToMainView" sender:self];
else
wantPush = YES;
}
@end
当您发送消息
[controller pushToMainView]
时,这将触发SeguepushToMainView
,但会一直保留,直到加载视图。在视图中调用代码如何
- (void)viewDidAppear
{
[super viewDidAppear];
[self performSegueWithIdentifier:@"authenticationSegue" sender:self];
}
然而,我仍然对这些解决方案感到不满意,因为原始视图仍然显示了几分之一秒
有没有关于如何在不首先显示原始视图的情况下显示新模式的想法?这是可行的,但我觉得这是一个相当不雅观的解决方案。这是实现这一目标的唯一途径吗?“performsguewithidentifer:”呼叫是否应该放在其他地方?Hey@blundin请尝试设置afterDelay:0.0并检查。让我知道,如果工作顺利
- (void)viewDidAppear
{
[super viewDidAppear];
[self performSegueWithIdentifier:@"authenticationSegue" sender:self];
}