2015-08-09 1 views
0

J'ai récemment implémenté une solution qui me permet de savoir quand un défilement a fini de défiler. C'est ainsi que lorsque je fais défiler ma table, je n'appelle qu'une méthode spécifique une fois que la vue de la table a complètement cessé de bouger.Dupliquer du code dans les méthodes UIScrollViewDelegate

J'ai suivi la réponse fournie ici: https://stackoverflow.com/a/8010066/2126233, mais je suis le code ci-dessous pour y compris faciliter la lecture:

- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView 
{ 
    self.isScrolling = YES; 
} 

- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate 
{ 
    //[super scrollViewDidEndDragging:scrollView willDecelerate:decelerate]; // pull to refresh 

    if(!decelerate) { 
     self.isScrolling = NO; 
     [self callMethodThatRequiresTableViewAndArrayOfDataToBePassedIn]; 
    } 
} 
- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView 
{ 
    self.isScrolling = NO; 
    [self callMethodThatRequiresTableViewAndArrayOfDataToBePassedIn]; 
} 

- (void)scrollViewDidScrollToTop:(UIScrollView *)scrollView 
{ 
    self.isScrolling = NO; 
} 

- (void)scrollViewDidEndScrollingAnimation:(UIScrollView *)scrollView 
{ 
     self.isScrolling = NO; 
} 

Cette solution fonctionne parfaitement. Cependant, j'ai besoin de cette même logique dans 4 contrôleurs de vue différents et je n'aime pas avoir du code en double.

Je ne sais pas comment je peux implémenter le code ci-dessus dans une classe et l'utiliser ensuite dans les 4 autres classes.

J'ai eu quelques idées:

  • J'ai une classe de base que tous les autres contrôleurs de vue héritent. Je pensais que je pourrais sous-classer la classe de base, puis les 4 contrôles d'affichage qui nécessitent ce code sont sous-classés à partir de cette nouvelle classe. Cette nouvelle classe fournit l'implémentation pour les méthodes de délégué de défilement. Mais comment appeler la méthode et passer dans les tablesView et dataArray.

  • Sous-classe UITableView et dans la sous-classe implémentant ces 4 méthodes. Cela signifie que je pourrais passer dans le tableauVoir ok. Mais la source de données est le tableau est un peu plus problématique.

Est-ce que quelqu'un a des suggestions sur une manière élégante ce problème peut être résolu. Un grand merci

+0

Si cette méthode nécessitant une vue tabulaire et un tableau est également nécessaire, vous pouvez déplacer ce code vers la classe de base. Si, par contre, ce tableau est uniquement spécifique à ce contrôleur de vue, vous pouvez ignorer scrollViewDidEndDecelerating et appeler super en lui et faire votre chose. La troisième idée qui me vient à l'esprit est que vous pourriez créer une nouvelle classe qui implémenterait ces méthodes et lors de l'initialisation, vous passeriez en argument la table et le tableau. C'est vraiment difficile pour moi de deviner quelle est la structure de vos objets :) – sloik

Répondre

0

Je pense que vous êtes sur la bonne voie droite

I have a base class that all other view controllers inherit from. I was thinking I could subclass the base class and then the 4 view controls that require this code are subclassed from this new class. This new class provides the implementation for the scroll delegate methods. 

Maintenant, votre question est

how do I call the method and passing in the tableView and dataArray 

Pour cela, vous pouvez prendre l'aide des méthodes de délégués Dans votre classe de base faire un protocole

En yourBaseClass.h

@protocol MyDelegate <NSObject> 
@required 
-(void)callMethodThatRequiresTableViewAndArrayOfDataToBePassedIn; 
@end 

@interface yourBaseClass:UITableViewController 
@property (nonatomic, weak) id<MyDelegate> myDelegate; 
@end 

Dans yourBaseClass.m

- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView 
{ 
    self.isScrolling = YES; 
} 

- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate 
{ 
    //[super scrollViewDidEndDragging:scrollView willDecelerate:decelerate]; // pull to refresh 

    if(!decelerate) { 
     self.isScrolling = NO; 
     if(self.myDelgate && [self.myDelegate respondsToSelector(callMethodThatRequiresTableViewAndArrayOfDataToBePassedIn)]) 
     { 
      [self.myDelegate callMethodThatRequiresTableViewAndArrayOfDataToBePassedIn]; 
     } 

    } 
} 
- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView 
{ 
    self.isScrolling = NO; 
    if(self.myDelgate && [self.myDelegate respondsToSelector(callMethodThatRequiresTableViewAndArrayOfDataToBePassedIn)]) 
    { 
     [self.myDelegate callMethodThatRequiresTableViewAndArrayOfDataToBePassedIn]; 
    } 

} 

- (void)scrollViewDidScrollToTop:(UIScrollView *)scrollView 
    { 
     self.isScrolling = NO; 
    } 

- (void)scrollViewDidEndScrollingAnimation:(UIScrollView *)scrollView 
    { 
     self.isScrolling = NO; 
    } 

Maintenant, vous devez implémenter simplement la méthode myDelegatecallMethodThatRequiresTableViewAndArrayOfDataToBePassedIn dans vos sous-classes.

Et oui a également fixé l'

self.myDelegate=self; 

dans votre méthode sous-classe viewDidLoad.

Avec cette approche, vous ne devez pas passer de tableView ou dataArray.

Espérons que cela aide.