通过委托将数据传递到UITableView

时间:2019-12-22 21:50:38

标签: ios swift uitableview delegates

在过去的几天里,我一直在努力将数据传递给各种视图控制器。 一开始我跳得太深,非常困惑。 最后我想我已经整理了。但是,下面看不到哪里出了问题。我已经接近了,但认为我在周末尝试了太多东西后一直视而不见。看过回调,但我认为代表对我来说更有意义。

我有2个视图控制器。一种带有UITableView,另一种通过文本字段输入数据。 我没有错误。但是,输入将在viewcontroller 2中打印,但不会显示在UITableView中。 很难发现我做错了什么。

VC1:

import Foundation
import UIKit


private let reuseidentifier = "Cell"

//here
struct Contact {
var fullname: String
}





class ContactController: UITableViewController {

var contacts = [Contact]()


override func viewDidLoad() {
    super.viewDidLoad()
    self.navigationController?.navigationBar.prefersLargeTitles = true
    self.navigationItem.title = "Contacts"

    self.navigationItem.rightBarButtonItem = UIBarButtonItem(barButtonSystemItem: .add, target: self, action: #selector(handleAddContact))
    view.backgroundColor = .white
    tableView.register(UITableViewCell.self, forCellReuseIdentifier: reuseidentifier)
}

@objc func handleAddContact () {

    //here
    let controller = AddContactController()
    controller.delegate = self

    self.present(UINavigationController(rootViewController: controller), animated: true, completion: nil)
}


//UITABLEVIEW
override func numberOfSections(in tableView: UITableView) -> Int {
    return contacts.count
}

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: reuseidentifier, for: indexPath)
    cell.textLabel?.text = contacts[indexPath.row].fullname
    return cell
}

}

  //here
  extension ContactController: AddContactDelegate {

func addContact(contact: Contact) {
    self.dismiss(animated: true) {
        self.contacts.append(contact)
        self.tableView.reloadData()
    }
}

}

输入数据的我的VC2

import Foundation
import UIKit

//here
protocol AddContactDelegate {
func addContact(contact: Contact)
 }

 class AddContactController: UIViewController {


//here
var delegate: AddContactDelegate?

let textField: UITextField = {
    let tf = UITextField()
    tf.placeholder = "Full Name"
    tf.textAlignment = .center
    tf.translatesAutoresizingMaskIntoConstraints = false
    return tf
}()

override func viewDidLoad() {
    super.viewDidLoad()

    view.backgroundColor = .white


   self.navigationItem.rightBarButtonItem = UIBarButtonItem(barButtonSystemItem: .done, target: self, action: #selector(handleDone))

    self.navigationItem.leftBarButtonItem = UIBarButtonItem(barButtonSystemItem: .cancel, target: self, action: #selector(handleCancel))

    view.addSubview(textField)
    textField.centerXAnchor.constraint(equalTo: view.centerXAnchor).isActive = true
    textField.centerYAnchor.constraint(equalTo: view.centerYAnchor).isActive = true
    textField.widthAnchor.constraint(equalToConstant: view.frame.width - 64).isActive = true

    textField.becomeFirstResponder()

}

//here
@objc func handleDone(){
print("done")

    guard let fullname = textField.text, textField.hasText else {
        print("handle error here")
        return
    }

    let contact = Contact(fullname: fullname)
    delegate?.addContact(contact: contact)
    print(contact.fullname)
}


@objc func handleCancel(){
    self.dismiss(animated: true, completion: nil )
}

}

2 个答案:

答案 0 :(得分:1)

您的委托实现没有问题,您需要实现numberOfRowsInSectionreturn 1

override func numberOfSections(in tableView: UITableView) -> Int {
     return contacts.count
}       
override func tableView(_ tableView: UITableView, 
      numberOfRowsInSection section: Int) -> Int {
    return 1
 }

或者认为您是否真的只需要这个

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

答案 1 :(得分:0)

我认为协议已正确实施。我唯一看到的是在vc2作为完成处理程序的一部分被解散后,您正在添加联系人。将代码放在调用dismiss之前:

func addContact()

contacts.append(contact)
tableView.reloadData()
dismiss()