我有一个TableView
,我想使用prepare(for segue)方法将数据传输到其他ViewController,但是我想将委托方法用于学习目的。我是这样做的:
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")
}
}
答案 0 :(得分:4)
这不是像prepare
方法中那样使用委托的地方,一旦获得let destination = segue.destination as! ContactDetailViewVC
,您就知道它的类型为ContactDetailViewVC
,并且编译器知道{{ 1}}符合ContactDetailViewVC
协议,因此您可以使用SendName
destination
上调用send方法
您的方法将因此更改为:
destination.send(name: selectedContact)
答案 1 :(得分:-1)
您可以直接使用delegate
对象来调用发送函数。
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)])
}
}
答案 2 :(得分:-1)
您必须在ContactsTVC本身中设置var delegate: SendName?
的值。代表们应该软弱无力,以免保留周期weak var delegate: SendName?
。