2017-07-30 6 views
0

を動作していない移入し、正しくFetchedResultsControllerによって移入されHolesTableと呼ばれるUITableViewを、含まれていること、ScorecardViewControllerと呼ばれます。FRCは、私はビューコントローラを持っているテーブルビューが、FetchedResultsControllerDelegate方法は

しかし、ユーザーがデータを編集すると、FRC delegateメソッドのどれも呼び出されません。つまり、各FRC delegateメソッドにブレークポイントを設定していますが、いずれもトリガーされません。

ScorecardViewControllerHolesTableためのデリゲートで、それを動作させるための方法の必要なセットを実装しています。また、HolesTableは、データソースがあり、ScorecardViewControllerとなるようにdelegateがIBに設定されています。

コンテキストの場合は、アプリケーションのどこかで、が正しく動作するようにほぼ同じ設定をしています。が正しく動作しています。私は、表示コントローラーCourseViewControllerを持っています。これは、UITableView,ScorecardTableをホストし、FRCがリンクされています。

ScorecardTableはFRCから正しく読み込まれ、すべてのFRC delegateメソッドが期待どおりに実行されています。私のコードとオンラインリサーチの広範な見直し後

は、私がFRC delegateHoleTableを接続し、どこかのステップを見逃していると結論していますが、私はうまくいかないことができる場所2の私の検査として、この出来事VCには明らかなことは何も表示されません。

ここに欠けている可能性がありますか?問題がどこにあるのかを特定するのに役立つコードを投稿できますか?

ありがとうございます! -

FRC UPDATE 1は、このように定義される:

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はうまく機能し、それは、HoleTable接続tableViewオブジェクトを取り込み。

Hole表は、3つの整数列HoleNumParStrokeIndexを含有します。私はカスタムセル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 
    } 
} 

、テキストフィールドSIFieldparFieldトリガーtextFieldDidBeginEditingtextFieldDidEndEditingに編集します。

FRCデリゲートメソッドがトリガされることはありません。これらは、FetchedResultsControllerDelegateプロトコルメソッドが設定されているUITableView、ScorecardViewControllerのクラスで定義されています。

- UPDATE 2

は、さらなる調査の後、私はFRCの背後にある管理オブジェクトコンテキストに起こっ更新がないので、FRCのデリゲートメソッドが発射されていない理由があると思います。

これをさらに進めて、これを実現させる簡単な方法があるかどうかを確認します。

+0

は、fetchedResultsControllerを作成するコードとデータを編集するコードを共有します。 –

答えて

0

これに対する解決策は単純明快でしたが、いくつかの脳細胞が分かりました。

欠けている作品は、私はセル方式内の私の編集はFRCのデリゲートメソッドをトリガーして `HoleTableViewCell」セルへHolesTableテーブルビューからオブジェクトへの参照を渡すために必要なことでした。

新しいクラスのHoleTableViewCell "の定義は次のようになります。セルを保持しているUITableViewためのクラス定義で、

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 
    } 
} 

をそして、以下が必要です:

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 

}

関連する問題