FRC填充的TableView但FetchedResultsControllerDelegate方法不工作
我有一个视图控制器,称为ScorecardViewController
,包含UITableView
,叫HolesTable
,这是正确的由FetchedResultsController
填充。FRC填充的TableView但FetchedResultsControllerDelegate方法不工作
但是,当用户编辑任何数据时,不会调用任何FRC delegate
方法 - 即我在每个方法上都设置了断点并且没有被触发。
ScorecardViewController
是HolesTable
委托,并实现必要的一套,它的工作方法。另外,HolesTable
,它的数据源和delegate
在IB中设置为ScorecardViewController
。
对于上下文,在应用程序的其他地方,我有一个几乎相同的设置,是正常工作。我有一个视图控制器,CourseViewController
,它承载一个UITableView
,ScorecardTable
,它有一个FRC链接到它。
ScorecardTable
从FRC正确填充,所有FRC delegate
方法正在按预期方式发射。
我的代码和在线研究广泛审查后,我得出的结论是我错过了某处的一步,HoleTable
连接到FRC delegate
,但我不能工作了哪里发生这种情况是我的两个检查VC的没有显示任何明显的。
还有什么我可能错过了吗?我可以发布哪些代码来帮助确定问题所在?
谢谢!
- UPDATE 1
的FRC被这样定义:
fileprivate lazy var fetchedResultsController: NSFetchedResultsController<Hole> = {
// Create Fetch Request
let fetchRequest: NSFetchRequest<Hole> = Hole.fetchRequest()
// Configure Fetch Request
self.teeColourString = self.scorecard?.value(forKey: "teeColour") as! String?
fetchRequest.predicate = NSPredicate(format: "%K == %@ AND %K == %@", "appearsOn.offeredAt.name", self.courseName!, "appearsOn.teeColour", self.teeColourString!)
fetchRequest.sortDescriptors = [NSSortDescriptor(key: "holeNumber", ascending: true)]
// Create Fetched Results Controller
let fetchedResultsController = NSFetchedResultsController(fetchRequest: fetchRequest, managedObjectContext: self.coreDataManager.mainManagedObjectContext, sectionNameKeyPath: nil, cacheName: nil)
// Configure Fetched Results Controller
fetchedResultsController.delegate = self
return fetchedResultsController
}()
的FRC运作良好,并填充连接tableView
对象,HoleTable
。
该Hole
表包含三个整数列HoleNum
,Par
和StrokeIndex
。我有一个自定义单元格HoleTableViewCell
,其中这些值显示在HoleTable
内部。
Par
和StrokeIndex
可以通过HoleTable
的实例更新,用户可以直接编辑单元。对于`HoleTableViewCell”的代码是:
class HoleTableViewCell: UITableViewCell, UITextFieldDelegate {
@IBOutlet weak var holeNumLabel: UILabel!
@IBOutlet weak var SIField: UITextField!
@IBOutlet weak var parField: UITextField!
static let reuseIdentifier = "HoleTableViewCell"
func textFieldDidBeginEditing(_ textField: UITextField) {
print("Editing started")
}
func textFieldDidEndEditing(_ textField: UITextField) {
if textField.tag == 4 {
//ParField has been edited
print("Par is now " + textField.text!)
} else if textField.tag == 5 {
// SIField has been edited
print("SI is now " + textField.text!)
}
}
override func awakeFromNib() {
super.awakeFromNib()
// Initialization code
}
override func setSelected(_ selected: Bool, animated: Bool) {
super.setSelected(selected, animated: animated)
// Configure the view for the selected state
SIField.delegate = self
SIField.tag = 4
parField.delegate = self
parField.tag = 5
}
}
在运行时,编辑的文本字段SIField
和parField
触发textFieldDidBeginEditing
和textFieldDidEndEditing
为我所期望的。
什么不发生是触发FRC委托方法。这些在UITableView的类中定义,ScorecardViewController
其中FetchedResultsControllerDelegate
协议方法已设置。
- 更新2
经过进一步调查,我认为FRC委托方法不是射击的原因是因为没有更新发生到FRC背后的管理对象上下文。
我将进一步研究这个问题,看看是否有直接的方法来实现这一点。
原来这个解决方案很简单,但是花了几个脑细胞弄清楚。
缺失的部分是我需要将对象的引用从HolesTable
TableView传递给HoleTableViewCell单元格,因此我在单元格方法中的编辑触发了FRC委托方法。
新类 'HoleTableViewCell' 的定义是这样的:
import UIKit
import CoreData
class HoleTableViewCell: UITableViewCell, UITextFieldDelegate {
@IBOutlet weak var holeNumLabel: UILabel!
@IBOutlet weak var SIField: UITextField!
@IBOutlet weak var parField: UITextField!
var hole: Hole?
static let reuseIdentifier = "HoleTableViewCell"
func textFieldDidBeginEditing(_ textField: UITextField) {
print("Editing started")
}
// This will need beefing up to enforce rules for Par and SI
func textFieldDidEndEditing(_ textField: UITextField) {
if textField.tag == 4 || textField.tag == 5 {
//ParField has been edited
//Prepare the Hole record for sending back to calling controller
hole?.setValue(Int(parField.text!), forKeyPath: "par")
hole?.setValue(Int(SIField.text!), forKey: "strokeIndex")
}
}
override func awakeFromNib() {
super.awakeFromNib()
// Initialization code
}
override func setSelected(_ selected: Bool, animated: Bool) {
super.setSelected(selected, animated: animated)
// Configure the view for the selected state
SIField.delegate = self
SIField.tag = 4
parField.delegate = self
parField.tag = 5
}
}
而且,在类定义为持有该小区的UITableView
,以下需要:
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
guard let cell = tableView.dequeueReusableCell(withIdentifier: HoleTableViewCell.reuseIdentifier, for: indexPath) as? HoleTableViewCell else {
fatalError("Unexpected Index Path")
}
// Fetch Holes
let hole = fetchedResultsController.object(at: indexPath)
// Pass the hole to the cell instance so edits in situ will trigger FRC delegate methods
cell.hole = hole
return cell
}
共享您创建fetchedResultsController的位置以及编辑数据的位置。 –