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”