我正在构建一个主细节应用程序。我有一个部分视图控制器(VC),它是主VC的子代。单击VC部分中的行会显示用户完成所需信息的不同详细信息VC。一旦详细VC中的信息完成,我希望在VC行的相关部分中显示复选标记。 FYI selectedProject是核心数据对象。
我在详细VC viewWillDisappear中调用通知来刷新VC部分。
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath)
let detailCase: String = selectedProject!.section![indexPath.row]
configureCell(cell, withSectionName: detailCase)
print("location complete is \(selectedProject!.completeLocation)")
print("electricity complete is \(selectedProject!.completeElectricity)"
print(cell.textLabel!.text!)
print(cell.accessoryType.rawValue)
return cell
}
func configureCell(_ cell: UITableViewCell, withSectionName sectionName: String) {
switch sectionName {
case "Project Details" :
cell.accessoryType = .checkmark
case "Location" :
if selectedProject?.completeLocation == true {
cell.accessoryType = .checkmark
}
case "Electricity Use" :
if selectedProject?.completeElectricity == true {
cell.accessoryType = .checkmark
}
default :
cell.accessoryType = .none
}
cell.textLabel!.text = sectionName
}
func refreshTable(notification: Notification) -> Void {
print("Notification ran")
self.tableView.reloadData()
}
控制台:
通知
位置完成是真的
电力完成是真的
项目详情
3
位置完成是真的
电力完成是真的
位置
3
位置完成是真的
电力完成是真的
用电
3
3's = .checkmark
因此看起来cellForRowAt确切地知道它应该做什么但是表格不容易显示复选标记。相反,您必须单击返回主VC然后转发到VC部分才能显示复选标记,或者您必须单击VC部分中的不同行,并且复选标记将随机显示。
我试过在dispatchqueue.main.async中调用reloadData而没有运气。我尝试再次在进程中的不同点调用reloadData而没有成功。我已经尝试调用tableView.beginUpdates / .endUpdates和reloadSectionData,再次没有成功获取要显示的复选标记。
如果我以编程方式连续提示VC viewWilDisappear和viewWillAppear部分,则一旦选择了VC部分中的不同行,就会出现复选标记。它“似乎”像reloadData()没有提示完全重载tableView。
FYI附件项目在故事板中设置为.none。
答案 0 :(得分:12)
需要在主队列上调用UI更新。试试这个:
DispatchQueue.main.async {
self.tableView.reloadData()
}
答案 1 :(得分:0)
好的,鉴于即将修复,我去了将tableView更改为静态而不是动态。我为所有固定单元格创建了tableViewCell出口,然后添加和删除了那样的复选标记。
感兴趣的人的代码:
var tableCellArray = [UITableViewCell]()
/*-----------------------------------------------------------*/
// MARK: - Outlets
@IBOutlet weak var projectDetails: UITableViewCell!
@IBOutlet weak var location: UITableViewCell!
@IBOutlet weak var electricityUse: UITableViewCell!
// MARK: - Actions
// MARK: - Default functions
override func viewDidLoad() {
super.viewDidLoad()
tableCellArray = [projectDetails, location, electricityUse]
configureCells()
NotificationCenter.default.addObserver(forName: Notification.Name(rawValue: "refresh"), object: nil, queue: nil, using: refreshTable)
}
// MARK: - Table view data source
func configureCells() {
var i = 0
for each in tableCellArray {
configureCheckmark(each, withIndex: i)
i = i + 1
}
}
func configureCheckmark(_ cell: UITableViewCell, withIndex index: Int) {
var accessoryType: UITableViewCellAccessoryType = .none
switch index {
case 0 :
accessoryType = .checkmark
case 1 :
if selectedProject?.completeLocation == true {
accessoryType = .checkmark
}
case 2 :
if selectedProject?.completeElectricity == true {
accessoryType = .checkmark
}
default :
accessoryType = .none
}
cell.accessoryType = accessoryType
}
func refreshTable(notification: Notification) -> Void {
configureCells()
tableView.beginUpdates()
tableView.endUpdates()
}
答案 2 :(得分:0)
这为我解决了。希望对您有所帮助:)
DispatchQueue.main.async {
self.tableView.reloadData()
self.tableView.beginUpdates()
self.tableView.endUpdates()
}