使用相同的重用标识符重新加载各种 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
是否包含来自各自当前 viewController
的 delegate
和 dataSource
,而不是我通过复制使用的主要那个和粘贴。
我有几个常见的 "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
是否包含来自各自当前 viewController
的 delegate
和 dataSource
,而不是我通过复制使用的主要那个和粘贴。