Xcode 7.3.1でMacアプリケーションを開発しています。モデルオブジェクトコンテキストをAppDelegateからArrayControllerに渡そうとしています。OS Xのコアデータ - 管理されたオブジェクトコンテキストをView Controllerに渡す
私は、私のコアデータスタックを作成するDataControllerというクラスを持っています。 DataController.managedObjectContextは、マネージオブジェクトコンテキストを保持します。次のように
私AppDelegateクラスは次のとおりです。
私のストーリーボードでclass AppDelegate: NSObject, NSApplicationDelegate {
var dataController: DataController!
func applicationDidFinishLaunching(aNotification: NSNotification) {
// Insert code here to initialize your application
// Create an instance of the DataController class.
dataController = DataController()
// Create a reference to the first ViewController embedded in the WindowController.
guard let splitViewController = NSApplication.sharedApplication().windows[0].contentViewController as? ManagedObjectContextSettable
else { fatalError("Wrong view controller type")}
// Set the managedObjectContext property.
splitViewController.managedObjectContext = dataController.managedObjectContext
}
func applicationWillTerminate(aNotification: NSNotification) {
// Insert code here to tear down your application
}
}
私は私のWindowControllerでSplitViewControllerが埋め込まれています。 SplitViewControllerには、SplitViewControllerという独自のカスタムView Controllerクラスがあります。ここでは、コードSplitViewControllerである:分割表示項目の1つに
class SplitViewController: NSSplitViewController, ManagedObjectContextSettable {
var managedObjectContext: NSManagedObjectContext!
override func viewDidLoad() {
super.viewDidLoad()
// Do view setup here.
// Create a reference to the first ViewController embedded in the WindowController.
let childControllers = self.childViewControllers
print("childControllers.count = \(childControllers.count)")
for childController in childControllers{
if childController.isKindOfClass(TableViewController){
print("Found TableViewController")
guard let tableViewController = childController as? ManagedObjectContextSettable
else { fatalError("Wrong view controller type")}
tableViewController.managedObjectContext = managedObjectContext
}
}
}
}
は、独自のビューコントローラがTableViewControllerを指名した私のテーブルビューです。ここでTableViewControllerのコードは次のとおりです。
ストーリーボードでclass TableViewController: NSViewController, ManagedObjectContextSettable, NSTableViewDataSource, NSTableViewDelegate {
@IBOutlet weak var tableView: NSTableView!
var managedObjectContext: NSManagedObjectContext!
override func viewDidLoad() {
super.viewDidLoad()
// Do view setup here.
//print(managedObjectContext.description)
}
}
私はArrayControllerをドラッグしてインスペクタのバインド]タブで、私はバインドするために設定してTableViewControllerを選択し、「self.managedObjectContext」へのモデルのキーのパスを設定しています。最終的には、マネージドオブジェクトコンテキストを受け取っていません。
組み込みViewControllerのprepareForSegue関数をオーバーライドする必要があるかどうかを確認することはできません。
どこが間違っていますか?
私は、AppControllerのviewDidLoadメソッドのすべての後にAppDelegate.applicationDidFinishLoadingが実行されていることに気付きました。 AppDelegate.applicationDidFinishLoadingメソッドでSplitViewControllerの子ビューコントローラ(TableViewController)のmanagedObjectContext変数を設定することをお勧めしますか? – TDC
私は 'SplitViewController'の' viewDidLoad'が 'TableViewController'の' viewDidLoad'の前に実行できることを提案しています。 'managedObjectContext'のセッターを実装し、childControllersに伝播します。 – Willeke
もう一つの考えられる解決策は、arraycontrollerの 'managedObjectContext'をプログラム的に' dataController.managedObjectContext'にバインドすることです。 (私はストーリーボードやビューコントローラの開発者がバインディングについて聞いたことはないと思う) – Willeke