代码之家  ›  专栏  ›  技术社区  ›  Raj Pawan Gumdal

TTphotoviewController:图像在滑动之前不加载

  •  3
  • Raj Pawan Gumdal  · 技术社区  · 14 年前

    我正在努力实现 TTPhotoViewController 在iPad应用程序示例中。我执行得很好 TTPhotoSource TTPhoto 协议。这个 tt照片视图控制器 不会显示图像,但在滑动之前不会显示。

    下面选项卡栏中的左右按钮似乎根本不起作用,它们从不更改显示的图像。这个 UIActivityIndicatorView 不会显示,也不会在到达最后或第一个图像时验证左右按钮。

    我正在初始化的子类 tt照片视图控制器 作为根视图控制器 UINavigationController 对象,我将其添加到视图中。

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

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

    谢谢, 拉吉

    3 回复  |  直到 13 年前
        1
  •  3
  •   Dustin    13 年前

    你最有可能凌驾于 viewWillAppear 你的方法 TTPhotoViewController 子类,但忘记调用super方法。

        2
  •  1
  •   Reid Rankin    14 年前

    有同样的问题。TTphotosource需要将modelDidFinishLoad:发送到其代理,当它完成加载后…否则,ttphotoviewcontroller假定它还没有准备好。

    然而,这并不是全部。尤其是当加载本地图像时,您的照片源可能会在ttphotoviewcontroller注册为代理之前完成加载。因此,您需要检查添加到TTphotosource中的代理,并向它们发送modeldidFinishLoad:message(如果添加完成加载)。

    如果从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”属性的名称,所以允许键值编码函数(因为它是非正式协议而自动具有)mutablerrayvalueforkey:合成符合nsmutablerray的代理对象,它允许通过将突变操作转换为对insertObject:insuperdelegatesatindex:和removeobjectfromsuperdelegatesatindex:方法的调用来编辑超级委托属性。

    然后,您所要做的就是重写“delegates”方法以返回这样一个生成的代理,poof,所有数组更改都会在您身上运行,允许您在ttphotoviewcontroller连接自身时发送适当的加载通知。

        3
  •  0
  •   Raj Pawan Gumdal    14 年前

    经过一些调试,我发现了问题,这只是一个快速的解决方法:

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

    -refresh
    

    并评论if条件:

    if (_isViewAppearing)
    

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

    这是一个快速解决方案,必须对bool进行调查: _isViewAppearing 后来。

    推荐文章