使用相同的reuseidentifier重新加载各种表视图

时间:2016-10-28 16:41:59

标签: swift ios10 nsnotificationcenter tableviewcell reloaddata

我有几个常见的“表视图”,其中的单元格具有相同的名称:"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复制并粘贴到所有其他视图控制器有关吗? 如果是这样,我试图重新创建表格视图,但它不会让我再次连接标签。

2 个答案:

答案 0 :(得分:0)

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

您的通知设置正确,但是当您的方法名称为reloadData()时,您仍然声明reloadLive对视图控制器不起作用。我还要仔细检查所有视图,设置他们在viewDidLoad中响应的通知,就像你在上面的第一个视图控制器中那样,然后他们都有方法reloadLive,然后重新加载你的表视图。

如果NewTableVC的上述代码是该视图控制器的完整代码,则尚未添加该视图控制器以监听通知,并且也没有方法可以调用以响应该通知。

答案 1 :(得分:0)

我解决了它,检查tableViewLiveCells是否包含来自相应当前delegate的{​​{1}}和dataSource,而不是我通过复制和粘贴使用的主要viewController