UIAlertController:在 UIAlertAction 上推送视图控制器(点击“确定”按钮)

Posted

技术标签:

【中文标题】UIAlertController:在 UIAlertAction 上推送视图控制器(点击“确定”按钮)【英文标题】:UIAlertController: push view controller upon UIAlertAction (hitting "Ok" button) 【发布时间】:2018-08-18 11:01:57 【问题描述】:

当用户点击 UIAlertController 弹出消息的特定按钮时,我想通过调用 pushViewController 打开一个新的视图控制器。

我尝试了以下方法(代码在 rootViewController 中):

let alertController = UIAlertController(title: title, message: "My message", preferredStyle: UIAlertControllerStyle.alert)
alertController.addAction(UIAlertAction(title: "Ok", style: UIAlertActionStyle.default, handler: action in
     let vc = ViewController2()
     self.navigationController?.pushViewController(vc, animated: true)
     print("called pushViewController")
))

消息“称为 pushViewController”被成功打印。但是,我没有出现新的 viewController(在此设置之外未执行时,相同的命令可用于显示第二个视图控制器)。

我的理论是,当调用此操作时,UIAlertController 位于初始视图控制器的顶部,这会禁止从初始视图控制器调用命令 pushViewController - 这是对的吗?

我该如何解决这个问题?

注意:This 即使在将代码更新到新的 Swift 后也无法正常工作。尽管如此,上面的命令应该有一个解决方案,因为它们在所有其他情况下都可以推送视图控制器。

【问题讨论】:

self.navigationController?.pushViewController 更改为self.present 【参考方案1】:

如果你的代码执行没有崩溃,我猜你的 navigationController 是 nil。要检查这一点,请在

处设置断点
print("called pushViewController")

并检查是否

self.navigationController

是否为零。如果它为 nil,那么您没有导航控制器,因此无法将新的 vc 推送到堆栈上。以下行仍将被执行,这似乎发生在你的情况。

【讨论】:

它是零。这是否支持我的理论,我该如何解决? 没有。这只是意味着显示警报的视图控制器没有嵌入到导航控制器中。因此,您不能将另一个视图控制器推送到导航控制器的堆栈上。如果您使用界面生成器,请选择视图控制器并选择“编辑器”->“嵌入”->“导航控制器”。【参考方案2】:

点击ok时用这个替换你的代码

 let storyboard = UIStoryboard(name: "Main", bundle: nil)
let dVC: ViewController2 = storyboard.instantiateViewController(withIdentifier: "Your vc2 stroryboard identifier") as! ViewController2
 self.navigationController?.pushViewController(dVC, animated: true)

希望对你有帮助

【讨论】:

【参考方案3】:

正如您所解释的,首先我建议您使用警报样式 .actionsheet 而不是 .alert

正如您在其中一个答案中评论的那样,navigationController 为 nil,那么您需要将导航控制器添加到您想要重定向的特定视图控制器。执行以下操作:

选择视图控制器 -> 编辑器 -> 嵌入 -> 导航控制器

【讨论】:

以上是关于UIAlertController:在 UIAlertAction 上推送视图控制器(点击“确定”按钮)的主要内容,如果未能解决你的问题,请参考以下文章

从 AppDelegate 到 PresentedViewController 的警报:“尝试在...上呈现 UIAlertController 已经在呈现 UIAlertController”

iOS核心笔记——UIAlertController

禁止UIAlertController的dimiss

UIAlertController 不会立即显示

如何在 Swift 中旋转 UIAlertController

从第一个 UIAlertController 打开第二个 UIAlertController