使用相同的重用标识符重新加载各种 table 视图

Reloading various table views with same reuseidentifier

我有几个常见的 "table views" 单元格具有相同的名称:"LiveViewCell",我想重新加载在 view controller 中创建的数据。 只有下一个 view controller 获得 reloadData() 调用作为 notification,甚至当前发送数据的那个也没有得到它。

这是我在所有视图控制器中实现的代码:

@IBOutlet weak var tableViewLiveCells: UITableView!

override func viewDidLoad() {
    super.viewDidLoad()

    NotificationCenter.default.addObserver(self, selector: #selector(self.reloadLive),name:NSNotification.Name(rawValue: "load"), object: nil)
}

func reloadLive(notification: NSNotification) {
    tableViewLiveCells.reloadData()
}

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

func numberOfSections(in tableView: UITableView) -> Int {
    return 1
}

public func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableViewLiveCells.dequeueReusableCell(withIdentifier: "LiveViewCell", for: indexPath) as! LiveViewCell

    let tab: Table!

    tab = NT[indexPath.row]

    cell.configureLiveCell(tab)

    return cell
}

这是 LiveViewCell.swift 文件

import UIKit


class LiveViewCell: UITableViewCell {


    @IBOutlet weak var tableNumberLeftLabel: UILabel!
    @IBOutlet weak var guestNumbersLabel: UILabel!

    @IBOutlet weak var timeInTableLabel: UILabel!
    @IBOutlet weak var tableNumberLbl: UILabel!
    @IBOutlet weak var timeRemainingLbl: UILabel!


    var table: Table!


    func configureLiveCell(_ NT: Table) {

        layer.cornerRadius = 20

        tableNumberLbl.text = "T" + String(NT.number)
        timeRemainingLbl.text = String(time)


    }

    func configureCell(_ NT: Table) {

        tableNumberLeftLabel.text = "T" + String(NT.number)
        guestNumbersLabel.text = "COVERS:" + String(NT.guests)
        timeInTableLabel.text = "TIME IN:" + NT.timeIn

    }



}

来自创建要重新加载的数据的 viewController:

import UIKit

var NT = Table.MyTables.newTable


class NewTableVC: UIViewController {


    @IBOutlet weak var tableViewLiveCells: UITableView!

    @IBOutlet weak var imageTableCreated: UIImageView!

    @IBOutlet weak var tableNumberTF: UITextField!
    @IBOutlet weak var guestNumberTF: UITextField!
    @IBOutlet weak var timeLabelTable: UILabel!
    @IBOutlet weak var prebooked: UISwitch!
    @IBOutlet weak var dateLabel: UILabel!

    @IBAction func createButton(_ sender: AnyObject) {

        print("createButton tapped")

        let newNumber = Int(tableNumberTF.text!)
        let newGuestNumber = Int(guestNumberTF.text!)
        let currentTimeArrival:String? = timeLabelTable.text

        if (tableNumberTF.text?.isEmpty)! || (guestNumberTF.text?.isEmpty)! {
            let alert = UIAlertController(title: "Missing input(s)", message: "Please fill in all the gaps", preferredStyle: .alert)
            alert.addAction(UIAlertAction(title: "Ok", style: .cancel, handler: nil))
            alert.addAction(UIAlertAction(title: "Back Home", style: .default, handler: {(alert: UIAlertAction) in

                self.dismiss(animated: true, completion: nil)


            }))
            self.present(alert, animated: true, completion: nil)

        } else {

            let presentTable = Table(number: newNumber!, guests: newGuestNumber!, timeIn: currentTimeArrival!)

            NT.append(presentTable)

            print("This is a new table with the following values")
            print(presentTable.number)
            print(presentTable.guests)
            print(presentTable.timeIn)
            print(NT.count)

            imageTableCreated.alpha = 1
            imageTableCreated.layer.zPosition = 500

            tableViewLiveCells.reloadData()

            let deadline = DispatchTime.now() + .seconds(1)
            DispatchQueue.main.async {
                NotificationCenter.default.post(name: NSNotification.Name(rawValue: "load"), object: nil)
            }
            DispatchQueue.main.asyncAfter(deadline: deadline) {
                self.imageTableCreated.alpha = 0
                self.imageTableCreated.layer.zPosition = -500

            }

        }
    }
}

reloadData() 不适用于任何 viewController,除了创建新数据的 NewTableVC viewController 的前一个,这是我的第一个在创建其他的之后创建。 可能是这个问题与将相同的 tableViewLiveCells 复制并粘贴到所有其他视图控制器有关吗? 如果是这样,我尝试重新创建 table 视图,但它不会让我再次连接标签。

在您的代码中设置断点并确保您的通知已发布,然后检查响应这些通知的每个视图是否都能看到该通知。

您的通知设置正确,但您一直声明 reloadData() 不适用于您的视图控制器,而您的方法名称是 reloadLive。我还会仔细检查所有视图设置,它们在 viewDidLoad 中响应哪些通知,就像您在上面的第一个视图控制器中所做的那样,然后它们都具有方法 reloadLive,然后将重新加载您的 [=21] =] 观看次数。

如果上面 NewTableVC 的代码是该视图控制器的完整代码,则该视图控制器尚未添加来侦听通知,也没有调用方法来响应通知。

我解决了这个问题,检查 tableViewLiveCells 是否包含来自各自当前 viewControllerdelegatedataSource,而不是我通过复制使用的主要那个和粘贴。