5

3 つの異なるテーブル (一度に 1 つ) を表示するビュー コントローラー (と呼びましょうMainViewContoller) を取得しました。ユーザーはセグメント コントロールをタップして、これらのテーブルを切り替えることができます。

これらの 3 つのテーブルを表示するために、MainViewContoller他に 3 つのビュー コントローラー (A、B、C) があり、それぞれがUITableViewサブビューとして を持ち、独自のデータを処理します。
aMainViewContollerがロードされると、コントローラ A、B、および C が開始され、それらの tableView がそのビューに追加されます。

- (void)viewDidLoad {
    [super viewDidLoad];

    ViewControllerA *vcA = [ViewControllerA alloc] init];
    [self.view addSubview:vcA.view];

    ViewControllerB *vcB = [ViewControllerB alloc] init];
    [self.view addSubview:vcB.view];

    ViewControllerC *vcC = [ViewControllerC alloc] init];
    [self.view addSubview:vcC.view];
}

たとえば、ユーザーがセグメント コントロールをタップして A を選択すると、MainViewContollerテーブル B と C が非表示になり、テーブル A が再表示されます。次のようになります。

if (userTapOnA) {
    self.viewControllerA.tableView.hidden = NO;
    self.viewControllerB.tableView.hidden = YES;
    self.viewControllerC.tableView.hidden = YES;
}  

問題:

ユーザーがステータスバーをタップすると、現在表示されているテーブルが一番上にスクロールするようにします。
この動作は非常に基本的で、通常のビュー コントローラーを使用すると無料で取得できますが、ご覧のとおり、私のビュー コントローラーは通常ではありません。
他のコントローラーのビューをビューとして使用することでMainViewContoller、デフォルトの動作が壊れると思います。そのためMainViewContoller、ステータスバーのタップを処理しません。

誰かがそれを解決する方法を考え出しましたか?

4

2 に答える 2

26

これは、UIScrollView ヘッダー ファイルから直接取得したものです。

/* ユーザーがステータス バーをタップすると、ステータス バーに最も近いタッチの下のスクロール ビューが一番上にスクロールされますが、そのscrollsToTopプロパティが YES である場合にのみ、そのデリゲートは から NO を返さshouldScrollViewScrollToTopず、まだされていません頂点で。scrollsToTopiPhone では、 == YESのオンスクリーン スクロール ビューが 1 つある場合にのみ、このジェスチャを実行します。複数見つかった場合はスクロールされません。*/

@property(nonatomic) BOOL scrollsToTop; // デフォルトは YES です。

したがって、あなたの場合、特定の瞬間に有効にしたいものを除いて、すべての scrollsToTop を NO に設定します。

于 2013-03-23T16:51:12.517 に答える
2

ネストされたコントローラーを子コントローラーとして登録する必要があります。

[self addChildViewController:vcA];
[self addChildViewController:vcB];
[self addChildViewController:vcC];

これが問題の解決に役立つかどうかはわかりませんが、それが正しい方法です。

于 2013-03-23T16:45:55.923 に答える