【问题标题】: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 说得有道理,但我只是尝试了一下,得到了同样的错误。这可能与错误中有一个额外的 ' 的事实有关吗?虽然这不在我的代码中......

标签: ios swift uiviewcontroller uinavigationcontroller segue


【解决方案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
 }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-08
    • 2015-03-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-16
    • 1970-01-01
    • 2023-03-05
    相关资源
    最近更新 更多