FRC填充的TableView但FetchedResultsControllerDelegate方法不工作

问题描述:

我有一个视图控制器,称为ScorecardViewController,包含UITableView,叫HolesTable,这是正确的由FetchedResultsController填充。FRC填充的TableView但FetchedResultsControllerDelegate方法不工作

但是,当用户编辑任何数据时,不会调用任何FRC delegate方法 - 即我在每个方法上都设置了断点并且没有被触发。

ScorecardViewControllerHolesTable委托,并实现必要的一套,它的工作方法。另外,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,ParStrokeIndex。我有一个自定义单元格HoleTableViewCell,其中这些值显示在HoleTable内部。

ParStrokeIndex可以通过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 
    } 
} 

在运行时,编辑的文本字段SIFieldparField触发textFieldDidBeginEditingtextFieldDidEndEditing为我所期望的。

什么不发生是触发FRC委托方法。这些在UITableView的类中定义,ScorecardViewController其中FetchedResultsControllerDelegate协议方法已设置。

- 更新2

经过进一步调查,我认为FRC委托方法不是射击的原因是因为没有更新发生到FRC背后的管理对象上下文。

我将进一步研究这个问题,看看是否有直接的方法来实现这一点。

+0

共享您创建fetchedResultsController的位置以及编辑数据的位置。 –

原来这个解决方案很简单,但是花了几个脑细胞弄清楚。

缺失的部分是我需要将对象的引用从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 

}