Ios 通过委托发送数据
我有一个Ios 通过委托发送数据,ios,swift,delegates,protocols,Ios,Swift,Delegates,Protocols,我有一个TableView,我想用prepare(for segue)方法将数据传输到另一个ViewController,但我想使用delegate方法进行学习。我这样做: protocol SendName { func send(name: String) } class ContactsTVC: UITableViewController, GetData { var delegate: SendName? var contacts = ["Anja Deo",
TableView
,我想用prepare(for segue)方法将数据传输到另一个ViewController,但我想使用delegate方法进行学习。我这样做:
protocol SendName {
func send(name: String)
}
class ContactsTVC: UITableViewController, GetData {
var delegate: SendName?
var contacts = ["Anja Deo","Hans Peter","Müller Schmitz"] {
didSet {
tableView.reloadData()
}
}
override func viewDidLoad() {
super.viewDidLoad()
self.title = "Kontakte"
}
override func numberOfSections(in tableView: UITableView) -> Int {
return 1
}
override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return contacts.count
}
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
...
}
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if segue.identifier == "showContactDetailView" {
let destination = segue.destination as! ContactDetailViewVC
if let delegate = delegate {
let selectedContact = contacts[(tableView.indexPathForSelectedRow!.row)]
delegate.send(name: selectedContact)
}
}
}
}
当然,所有这些都在UITableViewController类中
在我想去的ViewController中,我做了如下操作:
class ContactDetailViewVC: UIViewController, SendName {
var selectedContact: ContactsTVC?
override func viewDidLoad() {
super.viewDidLoad()
selectedContact?.delegate = self
}
func send(name: String) {
self.title = name
print("Should work")
}
}
当您获得
let destination=segue.destination as!时,这不是像您在prepare
方法中那样使用代理的地方!ContactDetailViewVC
您知道它属于ContactDetailViewVC
类型,并且编译器知道ContactDetailViewVC
符合SendName
协议,因此您可以通过目的地调用目的地上的send方法。send(名称:selectedContact)
因此,您的方法将更改为:
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if let destination = segue.destination as? ContactDetailViewVC {
let selectedContact = contacts[(tableView.indexPathForSelectedRow!.row)]
destination.send(name: selectedContact)
}
}
您可以直接使用委托
对象调用send函数
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if segue.identifier == "showContactDetailView" {
let destination = segue.destination as! ContactDetailViewVC
delegate.send(name: contacts[(tableView.indexPathForSelectedRow!.row)])
}
}
您必须在ContactsTVC本身中设置var delegate:SendName?
的值。代理应该是弱的,以避免保留循环,弱var delegate:SendName?
我知道这是可行的,但我想尝试使用代理。我正处于学习阶段,你正在尝试使用一个代表来完成一件不使用代表的事情……如果你想学习如何使用一个代表,请检查以下内容:或者这一个:我读了很多教程,但它们只是演示如何从b转换到a,而不是从a转换到b,它的区别直到相同。没有错误。它就是不起作用。函数send未在ContactDetailViewvc中执行仍然是相同的问题您是如何设置委托变量的值的?