【问题标题】:different viewcontroller segue不同的视图控制器segue
【发布时间】:2019-02-25 02:50:21
【问题描述】:

我希望我的应用程序可以“自动”从 ViewControll A 到 b,b 到 c,(a,b,c 是独立的视图控制器),所以我做到了:

  1. 在 A_ViewController 中定义了一个计时器,可以每隔一分钟从 A 到 B 再到 C。

  2. 在 StoryBoard 上为 ViewController A 和 B 设置 segue:

    A_ViewController : 'goToB' 和 'goToC'

    B_ViewController : 'goToC'

  3. 并在 A_ViewController 中覆盖“overwrite func prepare(for segue:.....”。

代码:

class A_ViewController:  ViewController {

    ...//in Timer
       //first 1 minute
       performSegueWithIdentifier("goToB", sender: self)
       //second minute
       B_Controller(). goToC()
    ...

    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        if segue.identifier == "goToB" {
            let B_Controller = segue.destination as! B_ViewController
            B_ViewController.msg = "From AtoB"
        }
        if segue.identifier == "goToSearchLocation" {
            let C_ViewController = segue.destination as! C_ViewController
            C_ViewController.msg = searchWord
            }
    }

class B_Controller:  ViewController {
    ...
    func goToC() {
       performSegueWithIdentifier("goToC", sender: self)
    }
}

运行APP后,第一次segue可以完成(显示ViewController B成功),但之后总是显示如下错误信息:

由于未捕获的异常 'NSInvalidArgumentException' 导致应用程序终止,原因:'Receiver () has no segue with identifier 'goToC''

但我确实在storyBoard 上设置了一个segue 'goToC'。我不知道如何解决它。代码已经是我从谷歌搜索修改的。

【问题讨论】:

    标签: ios swift segue


    【解决方案1】:

    当您说B_Controller().goToC() 时,您正在创建B_Controller新实例,您指的不是goToB 转场创建的现有实例。此外,由于您的 B_Controller 的新实例不是从情节提要中创建的,因此它对 segues 一无所知。

    您需要存储对您在属性中呈现的B_Controller 实例的引用。然后您可以使用该属性来调用goToC 函数。

    class A_ViewController:  ViewController {
    
        var bController: B_Controller?
    
        ...//in Timer
           //first 1 minute
           performSegueWithIdentifier("goToB", sender: self)
           //second minute
           self.bController?.goToC()
        ...
    
        override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
            if segue.identifier == "goToB" {
                self.bController = segue.destination as! B_ViewController
                self.bController.msg = "From AtoB"
            }
            if segue.identifier == "goToSearchLocation" {
                let C_ViewController = segue.destination as! C_ViewController
                C_ViewController.msg = searchWord
                }
        }
    
    class B_Controller:  ViewController {
        ...
        func goToC() {
           performSegueWithIdentifier("goToC", sender: self)
        }
    }
    

    您可能想要重新设计您的代码;在 B 中使用一个新的计时器来呈现 C 可能比在 A 中使用单个计时器更清晰。

    【讨论】:

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