UIScrollViewDelegate方法中的重复代码

时间:2015-08-09 10:29:23

标签: ios objective-c uitableview uiscrollviewdelegate

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

我按照此处提供的答案:https://stackoverflow.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个视图控件从这个新类中继承。这个新类提供了scroll委托方法的实现。但是如何调用该方法并传入tableView和dataArray。

  • 子类化UITableView以及实现这4种方法的子类。这意味着我可以传入tableView ok。但数据源阵列有点问题。

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

1 个答案:

答案 0 :(得分:0)

我认为你走在正确的轨道上

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。

希望这有帮助。