我有一个带有mainTable和menuTable声明的父“ListViewController”。
我还有两个控制器“MenuController”和“MainController”实现“ListViewController”。每个都有自己的故事板,但由于ECSlidingViewController(Facebook菜单效果),我可以在一个屏幕上看到。 MenuController有menuTable,MainController有mainTable。我希望mainTable与menuTable一起滚动。
问题是在“ListViewController”的(void)scrollViewDidScroll:(UIScrollView *)scrollView
中,我只能设置当前滚动的表的contentOffset。
ListViewController.h
@interface ListViewController : UIViewController {
IBOutlet UITableView *mainTable;
IBOutlet UITableView *menuTable;
}
ListViewController.m
- (void)scrollViewDidScroll:(UIScrollView *)scrollView {
self.mainTable.contentOffset = scrollView.contentOffset;;
// works only when I am scrolling mainTable,
// but I need it when I am scrolling menuTable
}
MenuController.m
@interface MenuController : ListViewController <UITableViewDelegate, UITableViewDataSource>
{
...
}
MainController.m
@interface MainController : ListViewController <UITableViewDelegate, UITableViewDataSource>
{
...
}
答案 0 :(得分:1)
我看到ListViewController
是一个表的委托,因此仅为此UITableView调用scrollViewDidScroll:
。您应该在其委托中跟踪第二个表滚动,您可以在表与其真实委托之间进行代理委托......
@interface ProxyTableViewDelegate <UITableViewDelegate>
@property (nonatomic, strong) id<UITableViewDelegate> realDelegate;
- (instancetype)initWithRealDelegate:(id<UITableViewDelegate>)realDelegate;
- (void)scrollViewDidScroll:(UIScrollView *)scrollView;
@end
@implementation ProxyTableViewDelegate
- (instancetype)initWithRealDelegate:(id<UITableViewDelegate>)realDelegate
{
if (self = [super init]) {
self.realDelegate = realDelegate;
}
return self;
}
- (void)scrollViewDidScroll:(UIScrollView *)scrollView
{
// Custom actions ...
if ([self.realDelegate respondsToSelector:@selector(scrollViewDidScroll:)])
[self.realDelegate scrollViewDidScroll:scrollView];
}
- (void)forwardInvocation:(NSInvocation *)invocation
{
[invocation invokeWithTarget:self.realDelegate];
}
@end
用法:
// tableView.delegate != nil
tableView.delegate = [[ProxyTableViewDelegate alloc] initWithRealDelegate:tableView.delegate];