TTPhotoViewController:直到滑动才加载图像

时间:2010-06-10 09:30:47

标签: iphone ipad three20 ttphotoviewcontroller

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

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

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

这排除了此处遇到问题的可能性: http://three20.stackexchange.com/questions/78/ttphotoviewcontroller-not-loading-images-immediately

我还缺少什么?任何人都面临类似的问题并找到了解决方法吗?

谢谢, 拉吉

3 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分: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的调用来编辑superDelegates属性:inSuperDelegatesAtIndex:和removeObjectFromSuperDelegatesAtIndex:methods。

然后,您所要做的就是覆盖“delegates”方法以返回这样生成的代理,并且poof,所有数组更改都会通过您运行,允许您在TTPhotoViewController附加自身时发送正确的加载通知。 / p>

答案 2 :(得分:0)

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

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

-refresh

并评论if条件:

if (_isViewAppearing)

最终将调用-updateView方法,该方法之前未被调用。

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