2010-06-10 5 views
3

J'essaie d'implémenter TTPhotoViewController dans un exemple d'application iPad. J'ai mis en œuvre correctement les protocoles TTPhotoSource et TTPhoto. Le TTPhotoViewController montre l'image, mais pas jusqu'à ce qu'elle soit glissée.TTPhotoViewController: Images ne se chargeant pas jusqu'à glisser

Les boutons droit et gauche dans la barre d'onglets ci-dessous ne semblent pas fonctionner du tout, ils ne changent jamais l'image affichée. Le UIActivityIndicatorView n'est jamais affiché, ni les boutons droit et gauche sont validés lorsque la dernière ou la première image est atteinte.

J'initialise la sous-classe TTPhotoViewController en tant que rootViewController d'un objet UINavigationController que je l'ajoute sur une vue.

Cela exclut la possibilité du problème auquel sont confrontés ici: http://three20.stackexchange.com/questions/78/ttphotoviewcontroller-not-loading-images-immediately

Qu'est-ce que je manque d'autre? Quelqu'un at-il fait face à des problèmes similaires et trouvé un moyen de contourner?

Merci, Raj

Répondre

0

Après un certain débogage, je trouve le problème, ce n'est une solution rapide:

En classe TTModelViewController du projet Three20UI, trouver la méthode

-refresh 

et commenter la condition if:

if (_isViewAppearing) 

Finalement, la méthode -updateView sera appelée et n'a pas été appelée précédemment.

Ceci est une solution rapide, ont à enquêter sur le bool: _isViewAppearing plus tard.

+0

Tout le monde avec une solution claire peut ajouter vos réponses. . . –

1

Avait le même problème. Le TTPhotoSource doit envoyer modelDidFinishLoad: à ses délégués quand il a fini de charger ... sinon, TTPhotoViewController suppose qu'il n'est pas encore prêt.

Mais ce n'est pas tout. En particulier lors du chargement d'images locales, votre source photo finira probablement le chargement avant que TTPhotoViewController soit enregistré en tant que délégué. Vous devez donc vérifier les délégués ajoutés à votre TTPhotoSource et leur envoyer un message modelDidFinishLoad: si vous avez terminé le chargement lors de leur ajout.

Et c'est plus facile à dire qu'à faire si vous héritez de TTModel, car il n'y a aucun moyen de s'enregistrer avec un NSMutableArray pour savoir quand il a été changé.

... Alors ajoutez le code suivant à votre sous-classe 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; 
} 

Cela crée une propriété « virtuelle » du nom superdélégués, qui est simplement un NSArray, pas NSMutableArray. Les méthodes insertObject: inSuperDelegatesAtIndex: et removeObjectFromSuperDelegatesAtIndex: car leurs noms incluent le nom de la propriété "superDelegates", autorisent la fonction Key-Value Coding (que vous avez automatiquement car il s'agit d'un protocole informel) mutableArrayValueForKey: pour synthétiser un objet proxy conforme à NSMutableArray, qui permet de modifier la propriété superDelegates en traduisant les opérations de mutation en appels aux méthodes insertObject: inSuperDelegatesAtIndex: et removeObjectFromSuperDelegatesAtIndex:.Ensuite, tout ce que vous avez à faire est de surcharger la méthode "délégués" pour renvoyer un tel proxy généré, et toutes les modifications de tableau vous traversent, vous permettant d'envoyer la notification de chargement appropriée lorsque TTPhotoViewController se connecte.

+0

On dirait une approche parfaite. Je vais essayer de le coder plus tard et voir à quel point cela convient à ma mise en œuvre. –

3

Vous avez probablement remplacé la méthode viewWillAppear dans votre sous-classe TTPhotoViewController mais vous avez oublié d'appeler la super méthode.

Questions connexes