0

我正在为我的一个具有 API 的应用程序创建一个 iPhone 客户端。我正在使用 GTMOAuth2 库进行身份验证。图书馆会使用正确的 url 为我打开一个 web 视图。但是我必须自己推动视图控制器。让我向您展示一些代码以使事情更清楚:

- (void)signInWithCatapult
{
    [self signOut];

    GTMOAuth2ViewControllerTouch *viewController;
    viewController = [[GTMOAuth2ViewControllerTouch alloc] initWithAuthentication:[_account catapultAuthenticaiton]
                                                                 authorizationURL:[NSURL URLWithString:kCatapultAuthURL]
                                                                 keychainItemName:kCatapultKeychainItemName
                                                                         delegate:self
                                                                 finishedSelector:@selector(viewController:finishedWithAuth:error:)];

    [self.navigationController pushViewController:viewController animated:YES];
}

我有一个“加号”/“添加”按钮,我动态添加到视图中并指向该方法:

self.navigationItem.rightBarButtonItem = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemAdd target:self action:@selector(signInWithCatapult)];

当我按下“添加”按钮时,应该发生的是打开带有动画的 Web 视图,然后将帐户添加到填充表格视图的帐户实例变量中。如果我添加一个帐户,这可以正常工作,但是一旦我尝试添加第二个帐户,屏幕就会变黑,并且控制台中会出现两个错误:

nested pop animation can result in corrupted navigation bar

Finishing up a navigation transition in an unexpected state. Navigation Bar subview tree might get corrupted.

我发现避免这个问题的唯一方法是在推动视图控制器时禁用动画。

请问我做错了什么?

4

3 回答 3

0

nested pop animation can result in corrupted navigation bar当我试图在视图控制器出现之前弹出它时,我收到了这条消息。覆盖viewDidAppear以在您的 UIViewController 子类中设置一个标志,指示该视图已出现(记住也要调用[super viewDidAppear])。在弹出控制器之前测试该标志。如果视图尚未出现,您可能需要设置另一个标志,指示您需要在视图控制器viewDidAppear出现后立即从内部弹出视图控制器。像这样:

@interface MyViewController : UIViewController {
    bool didAppear, needToPop;
}

……在@implementation……

- (void)viewDidAppear:(BOOL)animated {
    [super viewDidAppear:animated];
    didAppear = YES;
    if (needToPop)
        [self.navigationController popViewControllerAnimated:YES];
}

- (void)myCrucialBackgroundTask {
    // this task was presumably initiated when view was created or loaded....
    ...
    if (myTaskFailed) {  // o noes!
        if (didAppear)
            [self.navigationController popViewControllerAnimated:YES];
        else
            needToPop = YES;
    }
}

重复的popViewControllerAnimated调用有点难看,但我可以让它在我目前疲倦的状态下工作的唯一方法。

于 2013-10-14T23:35:01.273 回答
0

典型情况

  1. push或者pop控制器里面viewWillAppear:或者类似的方法。

  2. 您覆盖viewWillAppear:(或类似方法)但您没有调用[super viewWillAppear:].

  3. 您正在同时启动两个动画,例如运行动画pop然后立即运行动画push。然后动画发生碰撞。在这种情况下,[UINavigationController setViewControllers:animated:]必须使用 using。

于 2013-03-30T19:31:32.800 回答
0

您是否尝试过以下方法来解雇您?

[self dismissViewControllerAnimated:YES completion:nil];
于 2013-03-30T18:24:36.923 回答