为什么TableView在popViewController之后不重新加载数据?

时间:2019-09-02 02:10:19

标签: uitableview uicollectionview reloaddata swift5 popviewcontroller

在我的应用中,我有一个带有collectionViewtableView的ViewController。 我的CollectionView显示日期,而tableView显示该日期的数据。

我需要先创建一个日期,然后再创建其他数据,因此,当我键入该日期时,它会显示一个警报,然后我们进入另一个视图以创建新数据。

问题在于,当我保存新数据并使用popViewController返回上一个视图时,tableView不会重新加载数据。

当我再次返回视图时,我可以看到保存的数据,所以我返回到视图

我尝试在myTableView.reloadData()中使用ViewWillAppear,但是没有用。

如何在返回视图后立即重新加载 myTableView

此处是指向该应用视频的链接。 Here is the app working

这是我的IBAction,用于保存数据:

@IBAction func btSaveNewMeasures(_ sender: UIBarButtonItem) {

    let allMeasures = NSEntityDescription.entity(forEntityName: "AllMeasures", in: context)

    for textField in tfMeasuresValues {

        let newMeasure = NSManagedObject(entity: allMeasures!, insertInto: context)

        if let valueTxt = textField.text {
            let value = convertNumber.convertToDouble(valueTxt)
            if value != 0 {

                switch textField.tag {
                case 1: ///Body Measures
                    //Peso
                    let type = MeasuresType.bodyMeasures.rawValue
                    let index = NSNumber(value: textField.tag).int64Value
                    self.saveNewMessure(newMeasure, type: type, title: "Peso", value: value, index: index)
                case 2:
                    //Altura
                    let type = MeasuresType.bodyMeasures.rawValue
                    let index = NSNumber(value: textField.tag).int64Value
                    self.saveNewMessure(newMeasure, type: type, title: "Altura", value: value, index: index)
                case 3:
                    //%Gordura
                    let type = MeasuresType.bodyMeasures.rawValue
                    let index = NSNumber(value: textField.tag).int64Value
                    self.saveNewMessure(newMeasure, type: type, title: "% Gordura", value: value, index: index)
                default:
                    break
                }
            }
        }
    }
    do {
        try context.save()

        guard let navigation = navigationController else {return}
        navigation.popViewController(animated: true)

        self.delegate?.didFinishUpdates(finished: true)

    } catch let error {
        print("Error Saving Measures Values: \(error)")
    }
}

}

这是我的cellForRowAt:

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: MeasureCell.identifier, for: indexPath) as! MeasureCell
    let measures = fetchedRCAllMeasuresByDay.object(at: indexPath)
    cell.setupMeasureCell(measure: measures)
    return cell
}

我检查了是否在viewWillApperar中调用了myTableView.reloadData(),并确认了这一点。

这是我的类MeasureController中的方法setupTableView和setupCollectionView:

private func setupTableView() {
    myTableView.backgroundColor = Theme.background
    myTableView.separatorStyle = .none
    myTableView.tableFooterView = UIView()
    myTableView.delegate = self
    myTableView.dataSource = self
    myTableView.rowHeight = UITableView.automaticDimension
    myTableView.estimatedRowHeight = 80
    myTableView.register(MeasureCell.nib, forCellReuseIdentifier: MeasureCell.identifier)
}

private func setupCollectionView() {
    myCollectionView.backgroundColor = Theme.background
    myCollectionView.delegate = self
    myCollectionView.dataSource = self        
    myCollectionView.register(UINib(nibName: "DateCollectionCell", bundle: nil), forCellWithReuseIdentifier: cellCollectionViewID)

    //Set Collection View Cell Aligment
    let alignedFlowLayout = AlignedCollectionViewFlowLayout(horizontalAlignment: .right, verticalAlignment: .top)
    alignedFlowLayout.scrollDirection = .horizontal
    myCollectionView.collectionViewLayout = alignedFlowLayout
}

enter image description here

============================================= < / p>

这是我修复的NSFetechedResultsControllerDelegate:

extension MeasureController: NSFetchedResultsControllerDelegate {

func controller(_ controller: NSFetchedResultsController<NSFetchRequestResult>, didChange sectionInfo: NSFetchedResultsSectionInfo, atSectionIndex sectionIndex: Int, for type: NSFetchedResultsChangeType) {
    switch type {
    case .insert:
        myTableView.insertSections(IndexSet(integer: sectionIndex), with: .fade)
    case .delete:
        myTableView.deleteSections(IndexSet(integer: sectionIndex), with: .fade)
    case .move:
        break
    case .update:
        myTableView.reloadSections(IndexSet(integer: sectionIndex), with: .fade)
    @unknown default:
        fatalError()
    }
}


func controllerDidChangeContent(_ controller: NSFetchedResultsController<NSFetchRequestResult>) {
    myTableView.reloadData()
    myCollectionView.reloadData()
}

//Allow to show full section name in header.
func controller(_ controller: NSFetchedResultsController<NSFetchRequestResult>, sectionIndexTitleForSectionName sectionName: String) -> String? {
    return sectionName
}

}

这是修复了NSFRCD之后具有新应用行为的视频链接。

New App Behaviour

我发现在删除旧数据后立即添加新数据后未调用cellForRowAt。尽管已调用numberOfSections,但该值为零。但是,如果返回上一个视图并重新输入MeasureView,numberOfSections将具有正确的值,换句话说,numberOfSections将为非零。

我尝试使用委托和回调来重新加载myTableView,但未成功。

0 个答案:

没有答案