0

mainTable と menuTable 宣言を持つ親「ListViewController」が 1 つあります。「ListViewController」を実装する「MenuController」と「MainController」の 2 つのコントローラーもあります。それぞれに独自のストーリーボードがありますが、ECSlidingViewController (Facebook メニュー効果) のおかげで、1 つの画面で両方を見ることができます。MenuController には menuTable があり、 MainController には mainTable があります。mainTable を menuTable と一緒にスクロールしたい。問題は(void)scrollViewDidScroll:(UIScrollView *)scrollView、「ListViewController」で、現在スクロールされているテーブルの 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>
{
...
}
4

1 に答える 1

1

ご覧ListViewControllerのとおり、1つのテーブルのデリゲートであるscrollViewDidScroll:ため、この UITableView に対してのみ呼び出されました。そのデリゲートで2番目のテーブルスクロールを追跡する必要があります。テーブルとその実際のデリゲートの間でプロキシデリゲートを作成できます...

@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 に答える