0

我有一个带有 mainTable 和 menuTable 声明的父级“ListViewController”。我还有两个实现“ListViewController”的控制器“MenuController”和“MainController”。每个都有自己的故事板,但感谢 ECSlidingViewController(facebook 菜单效果),我可以在一个屏幕上看到两者。MenuController 有 menuTable,MainController 有 mainTable。我希望 mainTable 与 menuTable 一起滚动。问题是(void)scrollViewDidScroll:(UIScrollView *)scrollView在“ListViewController”中,我只能设置当前滚动的表的 contentOffset。

ListViewController.h

@interface ListViewController : UIViewController {
IBOutlet UITableView *mainTable;
IBOutlet UITableView *menuTable;
}

列表视图控制器.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

}

菜单控制器.m

@interface MenuController :  ListViewController <UITableViewDelegate, UITableViewDataSource>
{
...
}

主控制器.m

@interface MainController :  ListViewController <UITableViewDelegate, UITableViewDataSource>
{
...
}
4

1 回答 1

1

正如我所见ListViewController,它是一个表的委托,因此scrollViewDidScroll:仅针对此 UITableView 调用。您应该在它的委托中跟踪第二个表滚动,您可以在表和它的真实委托之间建立一个代理委托......

@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];
于 2013-04-08T19:47:51.977 回答