Swift 3 tableView没有在reloadData()上更新

时间:2017-03-04 05:12:33

标签: ios swift xcode uitableview checkmark

我正在构建一个主细节应用程序。我有一个部分视图控制器(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。

3 个答案:

答案 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()
        }