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中执行仍然是相同的问题您是如何设置委托变量的值的?