我最近实现了一个解决方案,可以让我知道滚动视图何时完成滚动。这样,当我滚动我的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。但数据源阵列有点问题。
有没有人以优雅的方式提出任何建议可以解决这个问题。非常感谢
答案 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。
希望这有帮助。