9

SDK 6.1、Xcode 4.6.1 を使用して、新規プロジェクト、Master-Detail iOS App、ARC、ストーリーボードなしを作成します。

次に、 にDetailViewControllersに含まれるviewDidLoad2 つの を追加し、2 つ目の s が次のように隠されていることを確認します。UITableViewUIViewController

- (void)viewDidLoad
{
    [super viewDidLoad];

    UIViewController *lViewController1 = [[UIViewController alloc] init];
    UITableView *lTableView1 = [[UITableView alloc] initWithFrame: self.view.frame];
    lTableView1.scrollsToTop = YES;
    [lViewController1.view addSubview: lTableView1];
    lTableView1.dataSource = self;
    [self.view addSubview: lViewController1.view];
    [self addChildViewController: lViewController1];

    UIViewController *lViewController2 = [[UIViewController alloc] init];
    UITableView *lTableView2 = [[UITableView alloc] initWithFrame: self.view.frame];
    lTableView2.scrollsToTop = YES;
    [lViewController2.view addSubview: lTableView2];
    lTableView2.dataSource = self;
    [self.view addSubview: lViewController2.view];
    [self addChildViewController: lViewController2];

    // now hide the view in view controller 2
    lViewController2.view.hidden = YES;
}

( が に設定されたs のDetailViewController100 行を返すデータソースであることを確認します)UITableViewCelltextLabel.text@"hello"

2 番目のビュー コントローラーが存在すると、それscrollsToTop(ステータス バーのタップ) が機能しなくなります。UIViewController封じ込めを使用せずに 2 つUITableViewの s を追加し、2 つ目の s を非表示に設定すると、scrollsToTop機能します。

私は何を間違っていますか?

4

5 に答える 5

8

scrollsToTop単一の可視ビューでのみ機能します。ドキュメントから:

このジェスチャは、表示されている単一のスクロール ビューで機能します。このプロパティが設定された複数のスクロール ビュー (日付ピッカーなど) がある場合、またはデリゲートが に戻っNOた場合、 は要求scrollViewShouldScrollToTop:UIScrollView無視します。スクロール ビューがコンテンツ ビューの一番上までスクロールした後、デリゲートにscrollViewDidScrollToTop:メッセージを送信します。

[tableView setContentOffset:CGPointZero animated:YES]代わりに、各テーブル (またはスクロール) ビューを手動で呼び出すことができます。これを行うには、プロトコルにscrollViewShouldScrollToTop:メソッドを実装します。UIScrollViewDelegate

- (BOOL)scrollViewShouldScrollToTop:(UIScrollView *)scrollView {
    [lTableView1 setContentOffset:CGPointZero animated:YES];
    [lTableView2 setContentOffset:CGPointZero animated:YES];
    return NO;
}
于 2013-04-15T07:54:53.467 に答える
3

私は現在あなたのプロジェクトを試しています。いつ

lViewController2.view.hidden = YES;

に置き換えられます

lTableView2.hidden = YES;

その後、コントローラーが含まれていても、スクロールは機能します。

コントローラーのビューとテーブルの間にビューを挿入してから、このビューを非表示にしようとしましたが、テーブルがスクロールしませんでした。

実験してコントローラーを非表示にしようとしましshouldAutomaticallyForwardAppearanceMethodsたが、テーブルがスクロールしませんでした。

結果:私の実験では、ビュー階層にスクロール ビューを 1 つだけ表示する必要がhiddenあり、親ビューのプロパティはチェックアウトされていません。親ビューではなく、他のすべてのスクロール ビューにhidden設定する必要があります。NO

于 2013-04-18T14:36:21.127 に答える
0

私はこれを使用しましたが、今では正常に動作します。

- (void)viewDidLoad
{
    [super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.

    UIViewController *lViewController1 = [[UIViewController alloc] init];
    UITableView *lTableView1 = [[UITableView alloc] initWithFrame: self.view.frame];
    lTableView1.scrollsToTop = YES;
    [lViewController1.view addSubview: lTableView1];
    lTableView1.dataSource = self;
    [self.view addSubview: lViewController1.view];
    [self addChildViewController: lViewController1];
    lTableView1.tag=1;

    UIViewController *lViewController2 = [[UIViewController alloc] init];
    UITableView *lTableView2 = [[UITableView alloc] initWithFrame: self.view.frame];
    lTableView2.scrollsToTop = NO;
    [lViewController2.view addSubview: lTableView2];
    lTableView2.dataSource = self;
    [self.view addSubview: lViewController2.view];
    [self addChildViewController: lViewController2];
    lTableView2.tag=2;
    // now hide the view in view controller 2
    lViewController2.view.hidden = YES;

}

- (NSUInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSUInteger)section {
    return 50;
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath      *)indexPath {
    static NSString * const kCellIdentifier = @"MyCell";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:kCellIdentifier];
    if (cell == nil) {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:kCellIdentifier];
    }
    cell.textLabel.text = [NSString stringWithFormat:@"hello %d %d",indexPath.row, tableView.tag];
    return cell;
}
于 2013-04-18T13:58:28.723 に答える
0

いくつかのオプションとさまざまなヒットをテストして試してみた後、最終的に1つの最終的な解決策、つまりsetBounds:(あなたの場合)に落ち着きましscrollViewたがtableView、うまくいきました。ただし、アニメーションには余分な労力を費やす必要があります。

    CGRect frame = scrollView.frame;
    frame.origin.x = 0;
    frame.origin.y = 0;
    [scrollView setBounds:frame];

ちなみにあなたの場合は、に戻っYESてみてください

- (BOOL)scrollViewShouldScrollToTop:(UIScrollView *)scrollView;

ただし、定義されていない場合は YES と見なされます。

于 2013-04-17T07:06:50.207 に答える