iOS - 展开我的初始视图控制器

los*_*ion 5 objective-c ios unwind-segue

我正在使用展开segue来展开我的故事板中的初始视图控制器.展开效果很好,我在初始视图控制器中实现了这个方法:

- (IBAction) unwindToInitialViewController:(UIStoryboardSegue *) unwindSegue {

}
Run Code Online (Sandbox Code Playgroud)

但是,如果我在展开后尝试使用segue到另一个视图控制器,我会收到以下错误:

警告:尝试显示其视图不在窗口层次结构中!

看起来这只有在我放松到故事板中被检查为"初始视图控制器"的视图控制器时才会出现.这是一个错误吗?我应该能够放松到初始控制器吗?其他想法?

编辑:

以下是我执行第二个segue的方法:

[self performSegueWithIdentifier:@"mySegue" sender:nil];
Run Code Online (Sandbox Code Playgroud)

我应该注意这是一个登录/注销问题.当我第一次登录从登录控制器到下一个控制器的segue工作时.当我退出时,我放松到初始视图控制器.然后我再次登录,从我的登录控制器到下一个控制器的segue不起作用.

编辑2:

从更多的研究中我找到了它,因为我正在使用代表登录.登录是异步的,我用AFNetworking打电话,当它完成后我调用我的登录委托(在这种情况下登录VC).此时,登录VC可以转到视图.

登录代码:

- (void) login: (NSDictionary *) parameters {
    [http.manager POST:url parameters:parameters success:^(AFHTTPRequestOperation *operation, NSDictionary *response) {
       [self.loginDelegate loginSuccess:response]; 
    } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
       [self.loginDelegate loginFailure:error]; 
    }];
}
Run Code Online (Sandbox Code Playgroud)

我的登录名VC是委托人:

- (void) loginSuccess:(NSDictionary *) response {
    // setup user info based on response
    ...
    // Segue 
    [self performSegueWithIdentifier:@"loginSuccessSegue" sender:nil];
}
Run Code Online (Sandbox Code Playgroud)

我已经检查过我是主线程的时候和我一起但仍然没有运气.我知道AFNetworking总是调用主线程上的成功/失败块.

棘手的部分.如果我将上面的代码更改为使用块而不是委托,则storyboard/segue不会搞砸,我可以多次登录和注销,没有任何问题.

为什么segue第一次使用委托模式,但在注销(展开)时,我不能再使用那个segue吗?

编辑3:

更多调查显示,在展开我的登录VC viewDidAppear被调用两次.在初始展开时,视图仍然在堆栈中,显示它快速显示并调用viewDidAppear.然而,这很快就会被动画化,而viewWillAppear会被另一个VC称为第二次.我认为这可能是问题的根源.为什么当我放松到那个VC的时候,它的动画效果只会被动画回来?

Rai*_*rze 1

请检查您是否loginDelegatenil第二次登录尝试期间。如果是nil“代表调用”将毫无结果。另请检查是否loginDelegate指向您期望的实例。如果它指向“旧”实例,则可能会试图提出错误的观点。

方法集viewDidLoadviewDidAppearviewWillAppear等可能会以意外的顺序调用,尤其是在返回导航或呈现广告并从中返回时。如果您在这些方法中分配了不同的初始化/设置任务,则最终可能会得到部分初始化的视图控制器。

(想想这个问题,我丢失了你关于遇到的错误的陈述,所以可能委托不为零。)

编辑:

我运行了一个小型的展开测试项目,并记录了调用viewDidAppear

viewDidAppear: <ViewController: 0x7a687700>
viewDidAppear: <VC2: 0x7a70e970>
viewDidAppear: <VC3: 0x7a694d50>
unwind target
viewDidAppear: <VC2: 0x7a70e970>
viewDidAppear: <ViewController: 0x7a687700>
viewDidAppear: <VC2: 0x7a71b790>
viewDidAppear: <VC3: 0x7a694d20>
unwind target
viewDidAppear: <VC2: 0x7a71b790>
viewDidAppear: <ViewController: 0x7a687700>
Run Code Online (Sandbox Code Playgroud)

短暂地进行放松VC3显示VC2并最终达到目标ViewController。现在第二次“登录”会导致视图控制器的不同实例。

您是否保留对“旧”视图控制器的引用?

另一个原因可能是,您的“注销”检测会触发两次(一次是在展开时,另一次是当中间或初始视图控制器检测到需要登录时?)。