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 方法重新实现 UIScrollView 分页
如何限制 UIScrollViewDelegate 仅适用于 UIViewController 中的一个视图