Cara meneruskan data antara tampilan kontainer dan pengontrol tampilan utama dengan benar

Saya menghadapi masalah berikut: Di VC utama saya memiliki TableView, dan pada pengontrol tampilan kontainer saya memiliki textField. Saya ingin menambahkan setiap teks, saya mengetik di wadah secara otomatis muncul sebagai baris baru di tableView di VC utama

Saat ini saya menggunakan segue untuk mengirim data dari VC utama ke container. Tapi apa yang harus saya terapkan untuk melakukan hal yang sama dalam urutan terbalik? Saya ingin menerapkan delegasi VC utama dalam tampilan kontainer saya, tetapi saya tidak tahu bagaimana melakukannya dengan benar. Atau mungkin ada solusi yang lebih umum.

Bagaimanapun, ini kode saya:

class MessageViewController: UIViewController {

    var currentUser: User!

    var containerViewController: InputTextViewController?

    @IBOutlet weak var enterMessageView: UIView!
    @IBOutlet weak var messageTableView: UITableView!
}

extension MessageViewController {

    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        if segue.identifier == "moveToInputText" {
            let connectContainerViewController = segue.destination as? InputTextViewController
            containerViewController = connectContainerViewController

            containerViewController?.userSendMessageTo = currentUser

        }
    }
}

extension MessageViewController: UITableViewDelegate, UITableViewDataSource {

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return currentUser.mesaageHistory.count
    }

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "messageCell") as! ChatMessageTableViewCell
        let data = currentUser.mesaageHistory[indexPath.row]
        cell.messageLabel.text = data.messageText

        return cell
    }
}

class InputTextViewController: UIViewController {

    @IBOutlet weak var messageTextField: UITextField!

    var userSendMessageTo: User!

    weak var delegate = MessageViewController()

    @IBAction func sendMessge(_ sender: Any) {

        handleSend()
        userSendMessageTo.mesaageHistory.append(message)

        print(userSendMessageTo.mesaageHistory[0].messageText)

        let row = userSendMessageTo.mesaageHistory.count - 1
        let insertIndexPath = IndexPath(item: row, section: 0)

        print(userSendMessageTo.mesaageHistory.count)

        delegate?.messageTableView.beginUpdates()
        delegate?.messageTableView.insertRows(at: [insertIndexPath], with: UITableViewRowAnimation.automatic)
        delegate?.messageTableView.endUpdates()

    }

}

person dand1    schedule 26.03.2017    source sumber


Jawaban (1)


Berikut cara menggunakan pola 'delegasi' dengan benar

  1. Deklarasi protokol & anggota delegasi

    protocol InputTextViewControllerDelegate: class {
       func someFunc()
    
       func anotherFunc()
    }
    
    
    class InputTextViewController: UIViewController {
    
     weak var delegate: InputTextViewControllerDelegate?
    }
    
  2. Implementasi protokol & pengaturan properti delegasi

    extension MessageViewController, InputTextViewControllerDelegate {
    
     // MARK: InputTextViewControllerDelegate
     //
    
     func someFunc()
     {
    
     }
    
    
     func anotherFunc()
     {
    
     }
    
    
     override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if segue.identifier == "moveToInputText" {
        let connectContainerViewController = segue.destination as? InputTextViewController
        containerViewController = connectContainerViewController
    
        containerViewController
    
       }
      }
    }
    
person Kobi    schedule 26.03.2017