关闭模态视图控制器后呈现不同的视图控制器

Posted

技术标签:

【中文标题】关闭模态视图控制器后呈现不同的视图控制器【英文标题】:Present a Different View Controller After Dismissing a Modal View Controller 【发布时间】:2012-06-27 12:58:22 【问题描述】:

我为 ios 应用程序中的各种 UI 设置展示了一个模态视图控制器。其中一项设置允许用户选择不同的主视图。当他们点击“完成”时,我想关闭模态视图并让新选择的视图控制器出现,而不会出现旧视图控制器与新视图控制器分离的瞬间延迟。如何实现?

更新:

这是我使用 Eugene 的技术成功实现的一种方法,但没有应用程序委托。相反,此实现特定于我的场景,其中导航堆栈中的视图控制器在实用程序应用程序中呈现模态视图控制器。

- (void)swapFrontSideViewController;

    UINavigationController *navigationVC = (UINavigationController *)[self presentingViewController];
    NSMutableArray *viewControllers      = [NSMutableArray arrayWithArray:navigationVC.viewControllers];
    UIViewControllerSubclass *selectedViewController = nil;
    if ([self.selectedFrontSide isEqualToString:FRONT_SIDE_NAME1]) 
        selectedViewController = [self.storyboard instantiateViewControllerWithIdentifier:FRONT_SIDE_NAME1];
     else if ([self.selectedFrontSide isEqualToString:FRONT_SIDE_NAME2]) 
        selectedViewController = [self.storyboard instantiateViewControllerWithIdentifier:FRONT_SIDE_NAME2];
    
    if (selectedViewController) 
        [viewControllers replaceObjectAtIndex:viewControllers.count -1 withObject:selectedViewController];
        [navigationVC setViewControllers:viewControllers];
        self.delegate = selectedViewController;
     else 
        NSLog(@"Error: Undefined Front Side Selected.");
    

【问题讨论】:

【参考方案1】:
- (IBAction)doDismiss:(id)sender 
  AppDelegate *appDelegate = (AppDelegate *)[UIApplication sharedApplication].delegate; // Get the app delegate
  NSMutableArray *viewControllers = [NSMutableArray arrayWithArray:appDelegate.navigationController.viewControllers]; // fetch its navigationController viewControllers stack
  UIViewController *replacementController; //initialize replacement controller
  [viewControllers replaceObjectAtIndex:viewControllers.count -1 withObject:replacementController]; // replace the top view controller in stack with the replacement one
  [appDelegate.navigationController setViewControllers:viewControllers]; //change the stack
  [self dismissModalViewControllerAnimated:YES];

【讨论】:

+1 用于获取 UIViewControllers 并替换它的方式。 -1 表示您实施的架构类型。 老实说,我不喜欢与AppDelegate 有任何参考或联系,我敢打赌,如果你想得更多,它会创建一个附件您会找到不需要该参考的解决方案。使代码更简单,避免紧耦合。 啊,我知道你在那里做了什么。聪明的。我会在今天晚些时候试一试,谢谢。 @JackyBoy 当然可以简单地使用presentingViewController 属性并获取其导航控制器,但这种解决方案仅适用于iOS 5+。看不出不喜欢与 AppDelegate 建立任何形式的连接的任何逻辑,因为即使是 Apple 的默认 CoreData 模板也是(或曾经)围绕 AppDelegate 而不是单独的单例数据访问层类创建的。无论如何,我认为这段代码没有任何害处,但感谢您的意见。 好吧,如果唯一的解决方案是真的使用AppDelegate,那就这样吧..我只是不喜欢UIViewControllers之间的逻辑和交互由AppDelegate管理,它对我来说真的没有意义,特别是当你可以在其他地方做的时候。

以上是关于关闭模态视图控制器后呈现不同的视图控制器的主要内容,如果未能解决你的问题,请参考以下文章

将模态呈现的视图控制器关闭到不同的底层视图控制器

关闭模态呈现的视图控制器后切换标签栏控制器视图控制器

呈现/关闭包含表格的模态视图控制器会使表格下降

关闭当前的模态视图控制器,然后呈现新的模态视图控制器

如何从模态视图控制器调用呈现视图控制器的方法

视图控制器以模态方式呈现/关闭时的通知?