在过去的几天里,我一直在努力将数据传递给各种视图控制器。 一开始我跳得太深,非常困惑。 最后我想我已经整理了。但是,下面看不到哪里出了问题。我已经接近了,但认为我在周末尝试了太多东西后一直视而不见。看过回调,但我认为代表对我来说更有意义。
我有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 )
}
}
答案 0 :(得分:1)
您的委托实现没有问题,您需要实现numberOfRowsInSection
和return 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()