如何取消模态转场并执行推送转场到新的视图控制器?

5
我将尝试从一个导航控制器中执行“推送segue”,在关闭先前呈现在该导航控制器上的模态视图后。
在模态视图(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下一个视图

enter image description here

编辑:我尝试了这个,在SingleSearchViewController中声明了变量_sender为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而不是nav controller。 - Daniel Galasko
你不能从UINavigationController中调用segue,你应该从UINavigationController的顶层控制器中调用它。 - jinhua liao
@jinhualiao 这有道理,但我刚试了一下,得到了同样的错误。这可能与错误中多出一个 ' 有关吗?虽然这不在我的代码中... - mattgabor
2个回答

2

请将您的代码更新为以下内容:

func textFieldShouldReturn(textField: UITextField) -> Bool {
    var searchNav = SearchNavigationController()
    self.dismissViewControllerAnimated(true, completion: {self.presentingViewController.goToNextView()})
    return true
}

我认为你是正确的,但我不确定如何将委托传递给模态视图控制器。我尝试了类似于我在prepareforsegue中添加的代码,但它无法将SearchNavigationController类型的值分配给SingleSearchViewController。 - mattgabor
我是否需要做某种分配来指示此视图的presentingViewController?当我尝试该代码时,它不允许我访问self.presentingViewController的方法。 - mattgabor
它不允许我自动完成函数名称,错误是“无法使用类型为'(Bool,completion:() -> _)'的参数列表调用'dismissViewControllerAnimated'”。 - mattgabor

0

我遇到了和mattgabor一样的问题,尝试了Ashish的解决方案,但对我没有用。

我的代码问题在于,在“dismissViewControllerAnimated()”的完成块内,当我想从之前执行推送的视图控制器中调用方法(例如此示例中的“goToNextView()”方法)时,“self.presentingViewController”属性已经为空。

所以我的解决方案就是在调用“dismissViewControllerAnimated()”之前创建一个变量来保存之前的视图控制器。使用当前的示例,代码如下:

    func textFieldShouldReturn(textField: UITextField) -> Bool {
    if let searchNav = self.presentingViewController as? SearchNavigationController {
        self.dismissViewControllerAnimated(true) {
            searchNav.goToNextView()
        }
    }
    return true
 }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接