如何使用委托将变量传递给另一个视图控制器

时间:2017-02-12 08:10:14

标签: ios swift delegates

我需要使用委托将变量发送到swift中的另一个视图控制器。

我有2个视图控制器:ViewControllerOne和ViewControllerTwo ViewControllerOne中的一个按钮使用segue链接到ViewControllerTwo(显示) 一个从ViewControllerOne传递给ViewControllerTwo的变量。

有人能告诉我需要在每个视图控制器的类中编写的代码,以便将变量发送到ViewControllerTwo吗? (我是初学者,如果你能向我解释它是如何运作的,我将不胜感激)

我知道我可以使用segue发送它,但我需要通过委托发送它。

谢谢

1 个答案:

答案 0 :(得分:0)

我认为您误解了何时使用委托来传递数据。

当您想要将数据从1个VC传递到另一个VC时,您可以选择两种方法(由prepareForSegue或委托)。在适当的情况下,应适当使用这两种方法。

通过prepareForSegue传递数据通常在数据来自VC的情况下使用,VC将另一个VC呈现给所呈现的VC。例如,当用户点击表VC中的单元格时,表格VC可以将用户点击的任何项目传递给下一个VC,该VC显示被点击的项目的细节。使用此方法传递数据的先决条件是segue必须连接数据发送方和数据接收方。

通过委托传递数据是另一回事。它通常在数据从呈现的VC传递到呈现它的VC时使用。例如,您有一个显示UIImagePickerController的VC。 UIImagePickerController有一个代表,可以将用户选择的照片/视频传递给您的VC。此方法要求数据接收方在某个时刻拥有数据发送方的实例。这样接收者可以将自己设置为发送者的代表。

现在,让我们来看看你的情况。使用prepareForSegue传递数据是您的最佳选择,因为:

  • VC1呈现VC2
  • 您想将数据从VC1传递到VC2
  • 连接VC的segue

在这里通过委托传递数据是毫无意义的。我会告诉你如何去做,然后你会明白为什么。

这是代表:

protocol ViewControllerOneDelegate {
    func acceptData(someInt: Int)
}

现在为您的VC2提供一个故事板ID。在VC1中添加名为delegate的属性。使VC2符合委托:

class ViewControllerOne: UIViewController, ViewControllerTwoDelegate {
    // implement acceptData however you like, doesn't matter
}

如果要显示VC2,请执行以下操作:

let sb = UIStoryboard(name: "Main", bundle: Bundle.main)
let vc2 = sb.instantiateViewController(withIdentifier: "Your Identifier") as! ViewControllerTwo
self.delegate = vc2

现在,您已准备好在下一行传递数据:

self.delegate.acceptData(someInt: 10)

现在你看到了什么问题吗?这两行:

self.delegate = vc2
self.delegate.acceptData(someInt: 10)

为什么不一起摆脱代表并且做:

vc2.acceptData(someInt: 10)

你真的不需要在这里使用委托。只需将数据直接分配给VC2中的变量或在VC2上调用某个方法。你有VC2实例!所以只需将数据传递给它!