วิธีส่งข้อมูลระหว่าง Container View และ Main View Controller อย่างถูกต้อง

ฉันกำลังจัดการกับปัญหาต่อไปนี้: ใน VC หลักฉันมี TableView และบนตัวควบคุมมุมมองคอนเทนเนอร์ฉันมี textField ฉันต้องการเพิ่มทุกข้อความ ฉันกำลังพิมพ์ในคอนเทนเนอร์โดยอัตโนมัติ ปรากฏเป็นแถวใหม่บน tableView ใน VC หลัก

ตอนนี้ฉันกำลังใช้ segue เพื่อส่งข้อมูลจาก VC หลักไปยังคอนเทนเนอร์ แต่ฉันควรใช้อะไรเพื่อทำสิ่งเดียวกันในลำดับย้อนกลับ? ฉันคิดว่าจะใช้การมอบหมายตัวแทนของ VC หลักในมุมมองคอนเทนเนอร์ของฉัน แต่ฉันไม่รู้ว่าจะต้องทำอย่างไรอย่างถูกต้อง หรืออาจมีวิธีแก้ปัญหาทั่วไปมากกว่านี้

อย่างไรก็ตามนี่คือรหัสของฉัน:

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 แหล่งที่มา


คำตอบ (1)


ต่อไปนี้เป็นวิธีใช้รูปแบบ 'ผู้รับมอบสิทธิ์' อย่างถูกต้อง

  1. การประกาศพิธีสารและสมาชิกผู้รับมอบสิทธิ์

    protocol InputTextViewControllerDelegate: class {
       func someFunc()
    
       func anotherFunc()
    }
    
    
    class InputTextViewController: UIViewController {
    
     weak var delegate: InputTextViewControllerDelegate?
    }
    
  2. การใช้โปรโตคอลและการตั้งค่าคุณสมบัติผู้รับมอบสิทธิ์

    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