我有几个常见的“表视图”,其中的单元格具有相同的名称:"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
复制并粘贴到所有其他视图控制器有关吗?
如果是这样,我试图重新创建表格视图,但它不会让我再次连接标签。
答案 0 :(得分:0)
在代码中设置断点并确保发布通知,然后检查响应这些通知的每个视图是否都在看到通知。
您的通知设置正确,但是当您的方法名称为reloadData()
时,您仍然声明reloadLive
对视图控制器不起作用。我还要仔细检查所有视图,设置他们在viewDidLoad
中响应的通知,就像你在上面的第一个视图控制器中那样,然后他们都有方法reloadLive
,然后重新加载你的表视图。
如果NewTableVC
的上述代码是该视图控制器的完整代码,则尚未添加该视图控制器以监听通知,并且也没有方法可以调用以响应该通知。
答案 1 :(得分:0)
我解决了它,检查tableViewLiveCells
是否包含来自相应当前delegate
的{{1}}和dataSource
,而不是我通过复制和粘贴使用的主要viewController