【问题标题】:Removing ViewController after showing modally a second ViewController在模态显示第二个 ViewController 后删除 ViewController
【发布时间】:2014-02-25 01:03:57
【问题描述】:

在我的应用程序中,我在应用程序委托方法 application:didFinishLaunchingWithOptions: 中有一些代码,用于确定初始视图控制器应该是 LoginViewController 还是 MainViewController

如果首先显示 LoginViewController 并且用户成功登录,我将使用这段代码以模态方式显示 MainViewController

UIStoryboard *storyBoard = [UIStoryboard storyboardWithName:@"Main" bundle:nil];
FSMainViewController *vc = (MainViewController *)[storyBoard instantiateViewControllerWithIdentifier:@"MainViewController"];
vc.loginViewController = self;
[self presentViewController:vc animated:YES completion:nil];

在屏幕上显示MainController 之后,我接下来要做的是从内存中删除LoginViewController,因此在MainViewControllerviewWillApper:animated: 方法中,我使用此代码删除(或在至少尝试)LoginViewController

- (void)viewDidAppear:(BOOL)animated
{
    [super viewDidAppear:animated];

    if (self.loginViewController) {
        [self.loginViewController dismissViewControllerAnimated:NO completion:nil];
    }
}

问题是此代码会导致奇怪的行为,例如从屏幕上删除 MainViewController 并且此错误消息显示在控制台中。

Unbalanced calls to begin/end appearance transitions for <LoginViewController: 0xb06e350>

我也尝试在 presentViewController:animated:completion 方法的完成块中调用 [self dismissViewControllerAnimated:NO completion:nil] 但仍然没有运气,它没有工作。

我做错了什么?当MainViewController 模态呈现时,如何从内存中删除底层LoginViewController

【问题讨论】:

    标签: ios uiviewcontroller


    【解决方案1】:

    如果您希望登录控制器消失,请不要显示您的主视图控制器,只需将其设为窗口的根视图控制器即可。

    UIStoryboard *storyBoard = [UIStoryboard storyboardWithName:@"Main" bundle:nil];
    FSMainViewController *vc = (MainViewController *)[storyBoard instantiateViewControllerWithIdentifier:@"MainViewController"];
    Self.window.rootViewController = VC;
    

    【讨论】:

    【解决方案2】:

    在展示另一个或它的presentingViewController 之后,您不能dismissViewController。在这里,你应该先解散LoginViewController,然后呈现MainViewController

    否则,如果您想使用pushViewController,您可以致电[self.navigationController setViewControllers: animated:] 删除LoginViewController

    如果您认为 presentingViewController 正是您想要的,请在 application:didFinishLaunchingWithOptions: 中尝试类似的操作

    if (self.loginViewController) { //Define loginViewController in appDelegate.h
        [self dismissViewControllerAnimated:NO completion:^{
            [self presentViewController:mainViewController animated:YES completion:nil];
        }];
    }
    else{
        [self presentViewController:mainViewController animated:YES completion:nil];
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-12-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多