在我的应用中,我有一个带有collectionView
和tableView
的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
}
============================================= < / 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之后具有新应用行为的视频链接。
我发现在删除旧数据后立即添加新数据后未调用cellForRowAt。尽管已调用numberOfSections,但该值为零。但是,如果返回上一个视图并重新输入MeasureView,numberOfSections将具有正确的值,换句话说,numberOfSections将为非零。
我尝试使用委托和回调来重新加载myTableView,但未成功。