在 UITabController 中关闭视图控制器

Posted

技术标签:

【中文标题】在 UITabController 中关闭视图控制器【英文标题】:Dismiss View Controller within UITabController 【发布时间】:2016-07-03 15:15:11 【问题描述】:

我的故事板上有以下堆栈

-> Navigation Controller 
 -> MyCoursesViewController (does a prepareForSegue to next 'view')
  -> Course Info UITabController (I select Setting Tab)
   -> Setting Navigation Controller
    -> SettingViewController

当我在设置选项卡中时:SettingViewController,我有一个 UIButton,上面写着“退出课程”,我希望它返回到 MyCoursesViewController。我怎样才能弹出到这个视图控制器?

我尝试了以下方法:

self.tabBarController?.navigationController?.dismissViewControllerAnimated(true, completion: nil)
self.navigationController?.tabBarController?.dismissViewControllerAnimated(true, completion: nil)
self.dismissViewControllerAnimated(true, completion: nil)
self.tabBarController?.navigationController?.popViewControllerAnimated(true)
self.navigationController?.popViewControllerAnimated(true)

但无济于事。

有没有办法简单地解除或我需要从 MyCoursesViewController 实现一个委托以通过 UITabController 传递给 SettingViewController?我不确定如何将代表传递给MyCourses -> Course Info Tab -> Setting。如果是MyCourses -> Setting,那只是从类到类的简单委托传递,但令人困惑的部分是中间的 Tab 控制器。

【问题讨论】:

【参考方案1】:

试试这个:

self.tabBarController?.navigationController?.popViewControllerAnimated(true)

我认为要从MyCoursesViewController 转到UITabController,您正在使用pushViewController 或segue 为您执行此操作,所以要返回您必须使用popViewControllerAnimated

dismissViewControllerAnimated 用于关闭使用presentViewController 显示的视图控制器

编辑:

所以如果你有两个 UINavigationController 我认为这段代码对你有用:

self.navigationController?.parentViewController?.navigationController!.popViewControllerAnimated(true)

【讨论】:

ops 我也尝试过,但没有将其包含在列表中 全部替换“?”和 ”!”并查看哪些行通过以及那些使应用程序崩溃的行,我认为所有行都以 self.navigationController! 开头。会崩溃,因为 SettingViewController 没有直接附加到 uinavigationController 这让我思考并查看了它在 SettingViewController 之前确实有一个 UINavigationController 的层次结构。所以我需要像双重流行音乐这样的东西。 UITabBarController 好像弹不出来 在更新 UITabBarController 类后,我也得到了这种方法。【参考方案2】:

根据您的描述,听起来MyCoursesViewController 是您的NavigationControllerrootViewController

您将CourseInfoUITabController 推入堆栈,而您的SettingViewController 实际上嵌入在UINavigationController 中,因此您可以这样做:

self.navigationController?.tabBarController?.navigationController?.popViewControllerAnimated(true)

【讨论】:

我更新了问题,所以要回答你的问题,是的,MyCoursesViewController 是 NavigationController 的 rootViewController。我对 CourseInfoUITabController 执行ForSegue。我尝试了两个弹出,但它没有弹出。 您为segue 设置的style 是什么?如果在storyboard中设置,在设置segueidentifier时可以看到style 它只是一个展示(推送) 我只是像您上面描述的那样设置了一个简单的项目,self.navigationController?.popViewControllerAnimated(true) 可以工作。在您过境时,日志中是否有任何警告消息? Depondies,我错过了一个级别,它是选择标签时是一个导航控制器。点击“设置”选项卡 -> 导航控制器 -> 设置 uiviewcontroller【参考方案3】:

您可以从 SettingViewController 发出自定义 NSNotification,它将由 MyCoursesViewController 处理并执行您需要的任何操作。

这种方法更正确,因为在开发过程中事情可能会变得更加复杂,并且您的层次结构可能会发生变化。通过使用 NSNotification,您可以减少部分代码的耦合,这是一件好事

【讨论】:

如何将视图传递给 MyCoursesViewController 以关闭/弹出?【参考方案4】:

在我看来,如果我正确理解您的视图层次结构,它应该是:

let appDelegate = UIApplication.sharedApplication().delegate as! AppDelegate
let rootNavigationController = appDelegate.window?.rootViewController as! UINavigationController
rootNavigationController.popToRootViewControllerAnimated(true)

【讨论】:

以上是关于在 UITabController 中关闭视图控制器的主要内容,如果未能解决你的问题,请参考以下文章

在附加的视图控制器中关闭 Popover segue

在 iOS 8 中关闭模式视图控制器时 UI 会失真

如何在导航控制器中关闭视图控制器,而不关闭整个堆栈

如何检查视图控制器是不是已在 Swift 中关闭

无法在 Interface Builder 中关闭键盘,因为视图控制器不会显示 doneEditing:

如何从自己的子视图控制器中关闭模态 uitabbarcontroller