我需要使用委托将变量发送到swift中的另一个视图控制器。
我有2个视图控制器:ViewControllerOne和ViewControllerTwo ViewControllerOne中的一个按钮使用segue链接到ViewControllerTwo(显示) 一个从ViewControllerOne传递给ViewControllerTwo的变量。
有人能告诉我需要在每个视图控制器的类中编写的代码,以便将变量发送到ViewControllerTwo吗? (我是初学者,如果你能向我解释它是如何运作的,我将不胜感激)
我知道我可以使用segue发送它,但我需要通过委托发送它。
谢谢
答案 0 :(得分:0)
我认为您误解了何时使用委托来传递数据。
当您想要将数据从1个VC传递到另一个VC时,您可以选择两种方法(由prepareForSegue
或委托)。在适当的情况下,应适当使用这两种方法。
通过prepareForSegue
传递数据通常在数据来自VC的情况下使用,VC将另一个VC呈现给所呈现的VC。例如,当用户点击表VC中的单元格时,表格VC可以将用户点击的任何项目传递给下一个VC,该VC显示被点击的项目的细节。使用此方法传递数据的先决条件是segue必须连接数据发送方和数据接收方。
通过委托传递数据是另一回事。它通常在数据从呈现的VC传递到呈现它的VC时使用。例如,您有一个显示UIImagePickerController
的VC。 UIImagePickerController
有一个代表,可以将用户选择的照片/视频传递给您的VC。此方法要求数据接收方在某个时刻拥有数据发送方的实例。这样接收者可以将自己设置为发送者的代表。
现在,让我们来看看你的情况。使用prepareForSegue
传递数据是您的最佳选择,因为:
在这里通过委托传递数据是毫无意义的。我会告诉你如何去做,然后你会明白为什么。
这是代表:
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实例!所以只需将数据传递给它!