2017-07-30 66 views
0

我有一個視圖控制器,稱爲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的位置以及編輯數據的位置。 –

回答

0

原來這個解決方案很簡單,但是花了幾個腦細胞弄清楚。

缺失的部分是我需要將對象的引用從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 

}