在两个未通过segue连接的View Controller之间传递数据

时间:2016-01-20 22:48:29

标签: ios xcode swift segue

我知道如果使用

通过segue连接,您可以在两个视图控制器之间传递信息
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
        guard let destinationViewController = segue.destinationViewController as?  searchTermViewController else { return }
        destinationViewController.courseCodes = selectedCourses
    }
}

如果由于.destinationViewController而没有segue,上面的代码会出错。如何在不必设置全局变量的情况下将信息传递给任意视图控制器?

2 个答案:

答案 0 :(得分:0)

转到故事板,选择第二个视图控制器,转到“身份检查器”选项卡并提供StoryBoard ID值。这应该是识别视图控制器的唯一值。

现在,在第一个视图控制器中,您可以运行此代码。这基本上会创建第二个视图控制器的对象,设置属性值(用于传输数据)并推送它(与segue一样)

let ctrl = self.storyboard?.instantiateViewControllerWithIdentifier("detailsView") 
                                                        as? SecondViewController
ctrl?.userId = 250 // data to pass.

self.navigationController?.pushViewController(ctrl!, animated: true)

提供userIdSecondViewController课程中的变量。更换 detailsView包含您之前提供的故事板ID值。

class SecondViewController: UIViewController {
     var userId : Int = 0   

    override func viewDidLoad() {
       super.viewDidLoad()
       // do something with self.userId
    }

}

答案 1 :(得分:0)

您可以设置委托模式以执行此操作。

以下是在两个对象之间设置委托模式的步骤,其中对象A是对象B的委托,对象B将消息发送回A.步骤如下:

  1. 为对象B定义委托协议。
  2. 为对象B提供可选的委托变量。这个变量应该很弱。
  3. 当有趣的事情发生时,例如当需要一条信息时,让对象B向其委托发送消息。你写委托?.methodName(self,...)
  4. 使对象A符合委托协议。它应该将协议的名称放在其类行中,并实现协议中的方法。
  5. 告诉对象B对象A现在是其委托。
  6. 这是一个教程,为您提供一个工作示例https://www.youtube.com/watch?v=9LHDsSWc680