TTPhotoViewController: изображения не загружаются до пролистывания

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

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

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

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

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

Спасибо Радж

3 ответа

Решение

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

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

-refresh

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

if (_isViewAppearing)

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

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

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

Была такая же проблема. 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: методы.

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

Другие вопросы по тегам