3

我正在尝试TTPhotoViewController在示例 iPad 应用程序中实现。我已经正确实施TTPhotoSourceTTPhoto协议。确实显示TTPhotoViewController图像,但直到刷卡。

下面标签栏中的左右按钮似乎根本不起作用,它们永远不会改变显示的图像。当UIActivityIndicatorView到达最后一个或第一个图像时,它永远不会被放置,也不会验证左右按钮。

我将子类初始化TTPhotoViewController为一个UINavigationController对象的 rootViewController,我将它添加到一个视图中。

这排除了这里面临的问题的可能性:http: //three20.stackexchange.com/questions/78/ttphotoviewcontroller-not-loading-images-immediately

我还缺少什么?有人遇到过类似的问题并找到解决方法吗?

谢谢,拉吉

4

3 回答 3

3

您很可能已经覆盖了子类viewWillAppear中的方法,TTPhotoViewController但忘记调用超级方法。

于 2011-03-08T00:15:14.757 回答
1

有同样的问题。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 附加自身时发送正确的加载通知。

于 2010-08-10T00:29:16.627 回答
0

经过一番调试,我发现了问题,这只是一个快速修复:

在 Three20UI 项目的 TTModelViewController 类中,找到方法

-refresh

并注释 if 条件:

if (_isViewAppearing)

最终-updateView将调用以前未调用的方法。

这是一个快速修复,必须调查 bool:_isViewAppearing稍后。

于 2010-06-10T11:40:51.283 回答