通过委托发送数据

时间:2018-07-19 13:35:59

标签: ios swift delegates protocols

我有一个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")
    }
}

3 个答案:

答案 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?