2

次の-awakeFromInsert実装では、ユーザーが追加ボタンを押したときにUIの配列コントローラーによってインスタンス化される新しいオブジェクトのプロパティを設定します。

- (void)awakeFromInsert
{
    [super awakeFromInsert];
    NSLog(@"Adding perceptron %ld to layer %ld", self.indexInLayer, self.layer.indexInNetwork);
    NSLog(@"New perceptron added to layer %@", self.layer );
    // more code here to do the configuration
}

問題は、呼び出さself.parentれたときに新しいオブジェクトの関係が設定されてい-awakeFromInsertないため(nil)、親オブジェクトにアクセスするためにそれを使用できないことです(たとえば、子の数や新しいオブジェクトのインデックス)。

上記のコードの出力:

2012-12-17 21:36:39.309 MLPManager[98112:403] Adding perceptron 0 to layer 0
2012-12-17 21:36:39.309 MLPManager[98112:403] New perceptron added to layer (null)

ビューにオブジェクトのインデックスを追加するためにメソッドを呼び出すとindexInLayerメソッドが完全に機能するため、新しいオブジェクトが正しく接続されていることを確信しています。UITableView

- (NSUInteger)indexInLayer
{
    NSUInteger index = [self.layer.perceptrons indexOfObject:self];
    //NSLog(@"indexInLayer returning %ld", index );
    return index;
}

私のデータモデルには、ネットワーク、レイヤー、パーセプトロンの3つのエンティティがあり、順序集合として配置され、多くの関係(つまり、親-子-孫)によって次のエンティティに接続されています。私のUIには3つのアレイコントローラーと3つのがありUITableViewsます。子アレイコントローラーには選択した親の子のみが含まれ、孫アレイコントローラーには選択した子の孫のみが含まれるように設定しました。これらのアレイコントローラに子または孫を追加すると、現在選択されている親の子として自動的に設定されます。それはすべてうまくいきます。

self.layerUIによってどの時点で設定されますか?誰かがこれが後に起こっていることを確認できますか-awakeFromInsert?もしそうなら、私が内部からそれを行うことができない場合、私はどのように新しいオブジェクトを構成することになっています-awakeFromInsertか?のAppleのドキュメントに-awakeFromInsertは、「レシーバーが最初に管理対象オブジェクトコンテキストに挿入されたときに、CoreDataフレームワークによって自動的に呼び出される」と記載されていることに注意してください。

レイヤーオブジェクトやデータ構造の他の部分に関する情報が必要な理由は、新しいパーセプトロンオブジェクトと同時に、他のさまざまなオブジェクト(パーセプトロンの子であるウェイト)を自動的にインスタンス化する必要があるためです。-awakeFromInsertこの種のタスクに使用する必要がありますか?

4

1 に答える 1

0

NSManagedObjectまず、モデル ( ) オブジェクトとビュー ( ) オブジェクトの間のコードが結合しているようUITableViewです。モデル ビュー コントローラーの設計パターンによると、これは推奨されません。

layerおよびindexInLayerの標準属性ではないNSManagedObjectため、これらはエンティティの属性であると想定しています。でセットアップを行うawakeFromInsert代わりに、属性に独自のセッター メソッドを実装して、必要なデータが利用可能になった時点で必要な作業を実行できるようにできないかと考えています。

独自のセッター メソッドを実装する場合は、Managed Object Accessor Methodsドキュメントの Apple のガイダンスに従う必要があります。具体的には次のとおりです。

関連するアクセスおよび変更通知メソッド (willAccessValueForKey:、didAccessValueForKey:、willChangeValueForKey:、didChangeValueForKey:、willChangeValueForKey:withSetMutation:usingObjects:、および didChangeValueForKey:withSetMutation:usingObjects:) を呼び出していることを確認する必要があります。

理由はわかりませんが、あなたの方法layerでは使用できません。代わりにその問題を解決する必要がある可能性があります。indexInLayerawakeFromInsert

于 2013-09-29T01:26:52.500 に答える