Ios 手动模式segue不工作,视图控制器不在窗口层次结构中?

Ios 手动模式segue不工作,视图控制器不在窗口层次结构中?,ios,ios5,ios6,uistoryboard,uistoryboardsegue,Ios,Ios5,Ios6,Uistoryboard,Uistoryboardsegue,我已经搜索了几个小时的网页和堆栈溢出,我无法解决这个问题。希望你们都能看到我的错误,因为我就是找不到 我有一个简单的基于故事板的应用程序,我刚刚开始。初始ViewController是UITabBarController的一个实例,具有模板中的两个虚拟ViewController。启动后,我需要检查设备是否登录到外部服务。如果没有,我将显示一个允许用户进行身份验证的模式ViewController,如果设备经过身份验证,那么我将只显示FirstViewController 以下步骤是我创建项目以

我已经搜索了几个小时的网页和堆栈溢出,我无法解决这个问题。希望你们都能看到我的错误,因为我就是找不到

我有一个简单的基于故事板的应用程序,我刚刚开始。初始ViewController是UITabBarController的一个实例,具有模板中的两个虚拟ViewController。启动后,我需要检查设备是否登录到外部服务。如果没有,我将显示一个允许用户进行身份验证的模式ViewController,如果设备经过身份验证,那么我将只显示FirstViewController

以下步骤是我创建项目以来所做的一切:

  • 在情节提要上创建AuthenticateViewController场景
  • 为AuthenticateViewController创建代码文件,并将其指定给相应的场景
  • 为UITabBarController子类创建代码文件,并将初始UITabBarController场景与该新子类关联
  • 在情节提要上从UITabBarController场景到AuthenticateViewController场景创建一个新片段
  • 从UITabBarController子类中的
    viewDidLoad
    手动调用segue
  • 当我运行应用程序时,模式segue不会启动,UITabBarController的第一个ViewController会显示出来,我在XCode中得到以下输出:

    Warning: 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]
    时,这将触发Segue
    pushToMainView
    ,但会一直保留,直到加载视图。

    在视图中调用代码如何

    - (void)viewDidAppear
    {
        [super viewDidAppear];    
        [self performSegueWithIdentifier:@"authenticationSegue" sender:self];
    }
    
    然而,我仍然对这些解决方案感到不满意,因为原始视图仍然显示了几分之一秒


    有没有关于如何在不首先显示原始视图的情况下显示新模式的想法?

    这是可行的,但我觉得这是一个相当不雅观的解决方案。这是实现这一目标的唯一途径吗?“performsguewithidentifer:”呼叫是否应该放在其他地方?Hey@blundin请尝试设置afterDelay:0.0并检查。让我知道,如果工作顺利
    - (void)viewDidAppear
    {
        [super viewDidAppear];    
        [self performSegueWithIdentifier:@"authenticationSegue" sender:self];
    }