我有一個視圖控制器,稱爲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背後的管理對象上下文。
我將進一步研究這個問題,看看是否有直接的方法來實現這一點。
共享您創建fetchedResultsController的位置以及編輯數據的位置。 –