如何解除模态转场,然后将转场推入新的视图控制器
Posted
技术标签:
【中文标题】如何解除模态转场,然后将转场推入新的视图控制器【英文标题】:How can I dismiss a modal segue then perform push segue to new view controller 【发布时间】:2015-07-30 05:16:21 【问题描述】:我正在尝试从navigation controller
执行push segue
,在取消之前在navigation controller
上呈现的modal
之后。
内部模态(UIViewController
):
func textFieldShouldReturn(textField: UITextField) -> Bool
var searchNav = SearchNavigationController()
self.dismissViewControllerAnimated(true, completion: searchNav.goToNextView())
return true
内部SearchNavigationController
:
func goToNextView()
performSegueWithIdentifier("searchNavigationToNextView", sender: self)
问题是当我点击返回时,我得到了这个错误:
由于未捕获的异常而终止应用程序 'NSInvalidArgumentException',原因:'接收者 () 与 标识符'searchNavigationToNextView''
转场出现在我的storyboard
中,从UINavigationController
到next view
。
编辑:尝试了这个,其中 _sender 在 SingleSearchViewcontroller 中声明为 var _sender = self 并且它不起作用。
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?)
if segue.identifier == "searchNavigationToSingleSearch"
let singleVC = segue.destinationViewController as! SingleSearchViewController
singleVC._sender = self
【问题讨论】:
您需要从代表其来源的适当控制器调用segue。在这种情况下,您可能应该在 self 而不是导航控制器上调用 segue 你不能从 UINavigationController 调用 segue,你应该从 UINavigationController 的顶部控制器调用它 @jinhualiao 说得有道理,但我只是尝试了一下,得到了同样的错误。这可能与错误中有一个额外的 ' 的事实有关吗?虽然这不在我的代码中...... 【参考方案1】:将您的代码更新为,
func textFieldShouldReturn(textField: UITextField) -> Bool
var searchNav = SearchNavigationController()
self.dismissViewControllerAnimated(true, completion: self.presentingViewController.goToNextView())
return true
【讨论】:
我认为你是对的,但我不确定如何将委托传递给模态视图控制器。我尝试了类似上面在 prepareforsegue 中添加的代码,但它无法将 SearchNavigationController 类型的值分配给 SingleSearchViewController 我必须做一些分配来指示这个视图的presentingViewController吗?当我尝试该代码时,它不允许我访问 self.presentingViewController 的方法 它不允许我自动完成函数名称,错误是无法使用类型为“(布尔,完成:()->_)”的参数列表调用“dismissViewControllerAnimated”【参考方案2】:我遇到了与 mattgabor 相同的问题,我尝试了 Ashish 的解决方案,但它对我不起作用。
我在代码中遇到的问题是,在“dismissViewControllerAnimated()”的完成块内,当我想从执行推送的前一个 viewController 调用方法时,属性“self.presentingViewController”已经为零(本例中的方法“goToNextView()”)
所以我的解决方案是在调用“dismissViewControllerAnimated()”之前创建一个变量来保存以前的 viewController。使用当前示例,它看起来像这样:
func textFieldShouldReturn(textField: UITextField) -> Bool
if let searchNav = self.presentingViewController as? SearchNavigationController
self.dismissViewControllerAnimated(true)
searchNav.goToNextView()
return true
【讨论】:
以上是关于如何解除模态转场,然后将转场推入新的视图控制器的主要内容,如果未能解决你的问题,请参考以下文章