3

これは OSX と 10.10 に関する質問であり、iOS のストーリーボードではないことを明確にしています。

ストーリーボードのメイン ウィンドウであるカスタム ウィンドウ コントローラーがあります。アプリはドキュメント ベースであるため、MOC へのアクセスに確立されたシングルトン メソッドを使用することはできません (すべてのドキュメントには独自のスタックがあります)。

したがって、他のオプションは、MOC を必要とするすべてのコントローラーに変数として渡すことです。ストーリーボードを使用する前に、コントローラーのカスタム初期化子を作成し、コントローラーを自分でインスタンス化することでこれを行いました。これは、コントローラーがビューのコンテンツをロードするまでに、コントローラーがその MOC 変数を設定していることを意味します。したがって、ビューは、コントローラーによってロードされた後、データ ソースなどをすべてロードできます。

ストーリーボードを使用しているので、ペン先が実際にロードされる前に MOC を渡す方法がわかりません。それは大きな問題ではありませんが、たとえば、私のビューの 1 つがテーブル ビューであったとします。ロードすると、データをロードしようとしますが、MOC がまだ nil であるため、もちろんロードできません。ロードされた後に設定してから、テーブルビューにデータをリロードするように依頼できますが、これは以前はエレガントだったものにとっては少しごちゃごちゃしているようです...ビューをロードする前にコントローラーを設定する方法が必要です右?

どうもありがとう。

4

1 に答える 1

0

Lister の Apple のサンプル コードは、ウィンドウ コントローラの setDocument: を上書きし、そこに必要なものを設定します。それは私が望んでいたものではありませんが、私が以前にやっていたことよりも不格好ではありません.

したがって、ウィンドウコントローラーで次のようになります。

- (void)setDocument:(NSPersistentDocument *)document {
   [super setDocument:document];

   self.managedObjectContext = document.managedObjectContext;

   NSSplitViewController *splitVC = (NSSplitViewController*)self.contentViewController;
   NSSplitViewItem *leftPane = [[splitVC splitViewItems]firstObject];
   NSSplitViewItem *rightPane = [[splitVC splitViewItems]lastObject];

   StaffSidebarViewController *staffSideBarVC = (StaffSidebarViewController*)[leftPane viewController];
   EventsViewController *eventsViewVC = (EventsViewController*)[rightPane viewController];

   staffSideBarVC.managedObjectContext = self.managedObjectContext;
   eventsViewVC.managedObjectContext = self.managedObjectContext;

   [staffSideBarVC.tableView reloadData];
   [eventsViewVC.tableView reloadData];
}

これについての考えをいただければ幸いです。ありがとう。

于 2014-06-14T10:28:04.647 に答える