2010-03-03 3 views
1

La réponse à cela est probablement juste sous mon nez, mais je ne le vois pas. Peut-être que quelqu'un ici pourrait aider.iPhone: Comment savoir Scrollview appelle les méthodes Delegate?

J'ai un scrollView qui permet le défilement vertical. Je l'ai mis en place:

[clefScrollView addSubview:clefView]; 
[clefScrollView setContentSize:CGSizeMake(clefView.frame.size.width, clefView.frame.size.height)]; 
clefScrollView.showsVerticalScrollIndicator = YES; 
clefScrollView.showsHorizontalScrollIndicator = NO; 
clefScrollView.delegate = self; 

Je les méthodes suivantes incluses dans le même fichier, afin de soutenir le protocole UIScrollViewDelegate:

- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate 
{ 
    NSLog(@"%f %f", scrollView.contentOffset.y, scrollView.contentSize.height); 
} 

- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView 
{ 
    NSLog(@"scrollViewDidEndDecelerating"); 
} 

- (void)scrollViewDidEndScrollingAnimation:(UIScrollView *)scrollView 
{ 
    NSLog(@"scrollViewDidEndScrollingAnimation"); 
} 

- (void)scrollViewDidScroll:(UIScrollView *)scrollView 
{ 
    NSLog(@"scrollViewDidScroll"); 
} 

En outre, le fichier .h pour ma classe comprend la Protocole:

@interface ClefNotesViewController : UIViewController <UIActionSheetDelegate,UIScrollViewDelegate,DoneWithVCDelegate> { 

le problème est que peu importe, les deux suivants ne sont jamais appelés:

-scrollViewDidEndDecelerating 
    -scrollViewDidScroll 

Les deux autres méthodes sont appelées en réponse à différents événements. Étant donné que deux des méthodes de protocole sont appelées, je suppose que j'ai correctement défini le délégué à moi-même. Alors quel est le problème?

Merci!

Mise à jour: J'ai trouvé le problème, mais je n'ai pas encore trouvé comment le résoudre. Ma classe s'étend sur deux fichiers. Dans le second fichier, un autre ScrollView met en œuvre -scrollViewDidEndDecelerating -scrollViewDidScroll

La question est, comment puis-je définir deux ensembles de méthodes différentes pour deux UIScrollViews différentes, dans la même classe?

Je pourrais essayer de manipuler deux scrollViews avec les mêmes méthodes de délégué, mais c'est moche puisque je ne serai pas capable de garder chaque ensemble de délégués avec le fichier de scrollView. Je pourrais aussi diviser ma classe. Y a-t-il un autre moyen?

Répondre

1

La question est, comment puis-je définir deux différents ensembles de méthodes pour deux différentes UIScrollViews, dans la même classe ?

Les méthodes delegate acceptent un objet scrollview comme paramètre. Vous devez vérifier quel scrollview est passé et répondre en conséquence. Vous pouvez définir la propriété d'étiquette de chaque scrollview afin de les identifier.

+0

oui, qui fonctionne. Ce que je voudrais, ce qui n'arrive pas souvent, est de pouvoir garder chaque délégué de scrollView dans son propre fichier, même si les deux fichiers font partie de la même classe. Cette classe ViewController gère deux ensembles de tâches différents, donc je devrais peut-être les séparer en deux contrôleurs de vue différents. – mahboudz

+0

Vous pouvez créer deux objets délégués et affecter chacun d'eux à une vue de défilement différente. Diviser le contrôleur lui-même pourrait être une mauvaise idée car il est très difficile de coordonner deux contrôleurs pour la même vue. Vous pouvez créer des classes différentes pour gérer les scollviews, puis en faire des propriétés du contrôleur de vue afin que le contrôleur puisse y accéder facilement. – TechZen

+0

J'ajouterai que si la fonctionnalité de scrollview est "bête" c'est-à-dire que le fonctionnement interne de la scrollview est indépendant de toute donnée particulière, vous pouvez simplement mettre la fonctionnalité dans une sous-classe scrollview et ne pas avoir d'autre objet . – TechZen

2

Il vous suffit de comparer les pointeurs avec ce qui est passé dans les méthodes

- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate 
{ 
    if(scrollView == self.firstScrollView){ 
      // do something 
    } 
    else if(scrollView == self.secondScrollView){ 
      // do something else 
    } 
} 

Cela suppose que vos scrollviews sont des propriétés sur la classe. Je suis à peu près sûr qu'une comparaison de pointeurs est bonne ici. Si cela vous donne du mal à utiliser quelque chose comme

if(scrollView.tag == self.firstScrollView.tag) 

Vous aurez besoin de leur attribuer une étiquette lorsque vous les créez

Questions connexes