TTPhotoViewController: изображения не загружаются до пролистывания - PullRequest
3 голосов
/ 10 июня 2010

Я пытаюсь реализовать TTPhotoViewController в примере приложения для iPad.Я правильно реализовал TTPhotoSource и TTPhoto протоколы.TTPhotoViewController показывает изображение, но только после прокрутки.

Правая и левая кнопки на панели вкладок ниже не работают вообще, они никогда не изменяют отображаемое изображение.UIActivityIndicatorView никогда не выставляется, ни правая, ни левая кнопки не проверяются при достижении последнего или первого изображения.

Я инициализирую подкласс TTPhotoViewController как rootViewController объекта UINavigationController, которыйЯ добавляю его в представление.

Это исключает возможность возникновения проблемы: http://three20.stackexchange.com/questions/78/ttphotoviewcontroller-not-loading-images-immediately

Что еще мне не хватает?Кто-нибудь сталкивался с подобными проблемами и нашел способ обойтись?

Спасибо, Радж

Ответы [ 3 ]

3 голосов
/ 08 марта 2011

Скорее всего, вы переопределили метод viewWillAppear в своем подклассе TTPhotoViewController, но забыли вызвать метод super.

1 голос
/ 10 августа 2010

Была такая же проблема.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», разрешают функции кодирования Key-Value (которую вы автоматически имеете, потому что это неформальный протокол) mutableArrayValueForKey: для синтеза объекта для проксиNSMutableArray, который позволяет редактировать свойство superDelegates путем преобразования операций мутации в вызовы insertObject: inSuperDelegatesAtIndex: и removeObjectFromSuperDelegatesAtIndex: method.

Затем все, что вам нужно сделать, это переопределить метод «делегатов», чтобы вернуть такой методсгенерированный прокси и poof, все изменения массива проходят через вас, что позволяет вам отправлять надлежащее уведомление о загрузке, когда TTPhotoViewController присоединяется.

0 голосов
/ 10 июня 2010

После некоторой отладки я обнаружил проблему, это просто быстрое решение:

В классе TTModelViewController проекта Three20UI найдите метод

-refresh

и прокомментируйте условие if:

if (_isViewAppearing)

В конце концов будет вызван метод -updateView, который ранее не вызывался.

Это быстрое решение, нужно разобраться с bool: _isViewAppearing позже.

...