如何解除模态转场,然后将转场推入新的视图控制器

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 中,从UINavigationControllernext 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
 

【讨论】:

以上是关于如何解除模态转场,然后将转场推入新的视图控制器的主要内容,如果未能解决你的问题,请参考以下文章

标签栏控制器在模态转场后消失

自定义模态视图的转场动画

如何使用转场

如何将标签栏项目中的项目链接到另一个视图控制器

CATransition(转场动画)

放松转场动作的第二场转场