0

xib と nib の時代に戻って、CoreData と macOS に取り組んでからしばらく経ちました。xib には、ドキュメントと managedObjectContext へのアクセスを許可できる「ファイルの所有者」があります。簡単。

NSPersistentDocument と私のストーリーボードでは、鶏が先か卵が先かという問題が少しあります。NSPersistentDocument からサブクラス化された私の Document クラスには、次のものがあります。

override func makeWindowControllers() {
    // Returns the Storyboard that contains your Document window.
    let storyboard = NSStoryboard(name: "Main", bundle: nil)
    let windowController = storyboard.instantiateControllerWithIdentifier("Document Window Controller") as! NSWindowController // <- when I need the moc
    self.addWindowController(windowController)
    windowController.contentViewController!.representedObject = self // <- when I set the representedObject
}

これは、Apple を含む多くの人々が提案しているようです。

私の問題はこれです: MainViewController では、オブジェクト コントローラーが必要で、それを managedObjectContext にバインドする必要がありますが、managedObjectContext が必要な場合は、presentedObject を self にまだ設定していません。したがって、例外がスローされます。makeWindowControllers メソッドの最後にpresentedObjectを設定するのは遅すぎますが、とにかく早く取得する方法がわかりません。

4

1 に答える 1

1

わかった。そう。昨夜何が起こったのかはわかりませんが、これを機能させる方法はありませんでした。

今朝、presentedObject に関するドキュメントを読み直しました。

presentedObject プロパティは、キー値のコーディングとキー値の監視に準拠しています。表示されたオブジェクトを nib ファイルのファイルの所有者として使用する場合、文字列 presentedObject で始まるキー パスを使用して、コントロールをファイルの所有者にバインドできます。

ドキュメントは、魔法がpresentedObjectにあることを明確に伝えています。したがって、makeWindowControllers メソッドが上記のとおりであることを確認し、ストーリーボードのオブジェクト コントローラーがドキュメントに記載されているとおりであることを確認しました。

(!) は気にしないでください。

パスに少し (!) が含まれていても、私は驚きませんでした。

次に、アプリが機能しないことを完全に期待して、アプリを忠実に起動しました。

しかし、それはうまくいきました。なぜ昨日それができなかったのかわかりませんが、すでに失われた時間についてできることはあまりありません.

フォローアップ: 実験として、昨日のツイストの 1 つを試してみました。(!) を取り除き、モックへの参照を便利にするために、このメソッドを MainViewController に追加しました。

var moc:NSManagedObjectContext? {
    if let doc = self.representedObject as? Document {
        return doc.managedObjectContext
    }
    return nil
}

次に、オブジェクト コントローラーのモデル キー パスとして「self.moc」を使用しました。これは機能せず、おなじみの例外がスローされました。モデル キー パスを「self.representedObject.managedObjectContext」に復元すると、すべてがうまく機能します。…魔法のように。

于 2016-07-16T16:06:04.677 に答える