UIScrollViewDelegate 方法中的重复代码

Posted

技术标签:

【中文标题】UIScrollViewDelegate 方法中的重复代码【英文标题】:Duplicate code in UIScrollViewDelegate methods 【发布时间】:2015-08-09 10:29:22 【问题描述】:

我最近实施了一个解决方案,可以让我知道滚动视图何时完成滚动。这样当我滚动我的表格视图时,我只会在表格视图完全停止移动时调用一个特定的方法。

我遵循了此处提供的答案:https://***.com/a/8010066/2126233,但为了便于阅读,我在下面包含了代码:

- (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;

此解决方案完美运行。但是我需要在 4 个不同的视图控制器中使用相同的逻辑,而且我不喜欢重复的代码。

我不确定如何在一个类中实现上述代码,然后在其他 4 个类中使用它。

我有几个想法:

我有一个所有其他视图控制器都继承自的基类。我在想我可以子类化基类,然后从这个新类中子类化需要此代码的 4 个视图控件。这个新类提供了滚动委托方法的实现。但是如何调用方法并传入tableView和dataArray。

子类化 UITableView 并在子类中实现这 4 个方法。这意味着我可以传入tableView ok。但是数据源是数组就有点问题了。

有没有人对解决这个问题的优雅方式有任何建议。非常感谢

【问题讨论】:

如果还需要需要表格视图和数组的方法,则可以将此代码移至基类。另一方面,如果此数组仅特定于此视图控制器,则您可以覆盖 scrollViewDidEndDecelerating 并在其中调用 super 并执行您的操作。我想到的第三个想法是,您可以创建一个新类来实现这些方法,并在初始化期间将表视图和数组作为参数传递。我真的很难猜出你的对象的结构是什么:) 【参考方案1】:

我认为你在正确的轨道上

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.

现在你的问题是

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

为此,您可以借助委托方法 在你的基类中制定一个协议

yourBaseClass.h

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

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

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;
  

现在您只需在子类中实现myDelegate 方法callMethodThatRequiresTableViewAndArrayOfDataToBePassedIn

是的,还设置了

self.myDelegate=self;

在您的子类viewDidLoad 方法中。

使用这种方法,您无需传递任何 tableView 或 dataArray。

希望这会有所帮助。

【讨论】:

以上是关于UIScrollViewDelegate 方法中的重复代码的主要内容,如果未能解决你的问题,请参考以下文章

UIScrollViewDelegate 不触发方法

UIScrollViewDelegate协议方法

如何使用 UIScrollViewDelegate 方法重新实现 UIScrollView 分页

如何限制 UIScrollViewDelegate 仅适用于 UIViewController 中的一个视图

覆盖scrollViewDidScroll时的问题,但不是UIScrollViewDelegate的所有其他方法

UIScrollViewDelegate scrollViewDidScroll 方法跟不上高速滚动(轻弹)?