【问题标题】:TTPhotoViewController: Images not loading until swipeTTPhotoViewController:图像在滑动之前不会加载
【发布时间】:2010-06-10 09:30:46
【问题描述】:

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

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

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

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

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

谢谢, 拉杰

【问题讨论】:

    标签: iphone ipad three20 ttphotoviewcontroller


    【解决方案1】:

    您很可能在 TTPhotoViewController 子类中重写了 viewWillAppear 方法,但忘记调用超级方法。

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 看起来是一个完美的方法。稍后我将尝试对其进行编码,看看它是否适合我的实现。
      【解决方案3】:

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

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

      -refresh
      

      并注释 if 条件:

      if (_isViewAppearing)
      

      最终-updateView 方法将被调用,而之前没有被调用。

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

      【讨论】:

      • 任何有明确解决方案的人都可以添加您的答案。 . .
      猜你喜欢
      • 2017-05-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-05
      • 1970-01-01
      • 2018-01-27
      相关资源
      最近更新 更多