有同样的问题。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”属性的名称,允许键值编码函数(你自动拥有,因为它是一个非正式协议) mutableArrayValueForKey: 合成一个代理对象符合NSMutableArray,它允许通过将突变操作转换为对 insertObject:inSuperDelegatesAtIndex: 和 removeObjectFromSuperDelegatesAtIndex: 方法的调用来编辑 superDelegates 属性。
然后,您所要做的就是重写“委托”方法以返回这样一个生成的代理,并且噗,所有数组更改都通过您运行,允许您在 TTPhotoViewController 附加自身时发送正确的加载通知。