同じ問題がありました。TTPhotoSource は、読み込みが完了したときにデリゲートに modelDidFinishLoad: を送信する必要があります... そうしないと、TTPhotoViewController はまだ準備ができていないと想定します。
しかし、それだけではありません。特にローカル画像をロードする場合、TTPhotoViewController がデリゲートとして登録される前に、写真ソースのロードが終了する可能性があります。そのため、デリゲートが TTPhotoSource に追加されているかどうかを確認し、デリゲートが追加されたときに読み込みが完了している場合は、それらに modelDidFinishLoad: メッセージを送信する必要があります。
TTModel から継承する場合は、NSMutableArray に登録していつ変更されたかを確認する方法がないため、言うは易く行うは難しです。
だから...次のコードをTTPhotoViewControllerサブクラスに追加してください...
// superDelegates KVO Mutator Methods
- (NSMutableArray*)delegates {
return [self mutableArrayValueForKey:@"superDelegates"];
}
- (void)insertObject:(id)object inSuperDelegatesAtIndex:(NSUInteger)index {
[super.delegates insertObject:object atIndex:index];
if ([self isLoaded]) {
if ([object respondsToSelector:@selector(modelDidFinishLoad:)]) {
[object performSelector:@selector(modelDidFinishLoad:) withObject:self];
}
}
}
- (void)removeObjectFromSuperDelegatesAtIndex:(NSUInteger)index {
[super.delegates removeObjectAtIndex:index];
}
- (NSArray*) superDelegates {
return super.delegates;
}
これにより、superDelegates という名前の「仮想」プロパティが作成されます。これは単なる NSArray であり、NSMutableArray ではありません。insertObject:inSuperDelegatesAtIndex: および removeObjectFromSuperDelegatesAtIndex: メソッドは、それらの名前に「superDelegates」プロパティの名前が含まれているため、Key-Value Coding 関数 (非公式のプロトコルであるため自動的に使用されます) を許可します。 NSMutableArray は、ミューテーション操作を insertObject:inSuperDelegatesAtIndex: および removeObjectFromSuperDelegatesAtIndex: メソッドの呼び出しに変換することで、superDelegates プロパティを編集できるようにします。
次に、「デリゲート」メソッドをオーバーライドして、そのような生成されたプロキシを返すだけです。すべての配列の変更が実行され、TTPhotoViewController がアタッチされたときに適切なロード通知を送信できます。