web-dev-qa-db-ja.com

UITableViewでのスクロール位置の設定

私は、iPhoneの連絡先アプリケーションがどのように機能するかに似たものを動作させるアプリケーションを持っています。新しい連絡先ユーザーを追加すると、連絡先情報のある表示専用画面が表示されます。ナビゲーションバーから[すべての連絡先]を選択すると、最近追加された連絡先が表示されているすべての連絡先のリストに移動します。

次を使用して、ビューを特定の行に移動できます。

    [itemsTableView selectRowAtIndexPath:indexPath animated:NO scrollPosition:UITableViewScrollPositionBottom];

...しかし、機能していません。私は呼び出した直後にこれを呼び出しています:

    [tableView reloadData];

ここでselectRowAtIndexPath:animated:scrollPositionメソッドを呼び出すことは想定していないと思います。しかし、ここになければ、どこに?

次のメソッドの後に呼び出されるデリゲートメソッドはありますか?

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath;
27
Mustafa

私は同様のアプリを持っていると思います:アイテムのリスト。「+」をタップ->新しい画面、戻って更新されたリストを確認し、下部に追加されたアイテムを表示するためにスクロールします。

要約すると、reloadDataviewWillAppear:animated:およびscrollToRowAtIndexPath:... in viewDidAppear:animated:

// Note: Member variables dataHasChanged and scrollToLast have been
// set to YES somewhere else, e.g. when tapping 'Save' in the new-item view.

- (void)viewWillAppear:(BOOL)animated {
    [super viewWillAppear:animated];
    if (dataHasChanged) {
        self.dataHasChanged = NO;
        [[self tableView] reloadData];
    } else {
        self.scrollToLast = NO; // No reload -> no need to scroll!
    }
}

- (void)viewDidAppear:(BOOL)animated {
    [super viewDidAppear:animated];
    if (scrollToLast) {
        NSIndexPath *scrollIndexPath = [NSIndexPath indexPathForRow:([dataController count] - 1) inSection:0];
        [[self tableView] scrollToRowAtIndexPath:scrollIndexPath atScrollPosition:UITableViewScrollPositionBottom animated:YES];
    }
}

これがお役に立てば幸いです。リストの中央に何かを追加すると、代わりにその位置に簡単にスクロールできます。

61
squelart

あなたはこれを試すことができます、uitableviewのスクロールボタンをクリックすると、あなたに似た種類の私のアプリケーションが起動します。

[tableviewname setContentOffset:CGPointMake(0, ([arrayofcontact count]-10)*cellheight) animated:YES];

10は、上にスクロールするセルの数です

これがあなたを助けることを願っています:-)

6
Birju

viewDidAppear(_:)からオフセットが設定されている場合、スクロールアニメーションは避けられません。初期スクロールオフセットを設定するのに適した場所は、viewWillAppear(_:)です。テーブルビューのコンテンツサイズはその時点では定義されていないため、Table Viewのレイアウトを強制する必要があります。

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)

    tableView.setNeedsLayout()
    tableView.layoutIfNeeded()

    if let selectedIndexPath = selectedIndexPath, tableView.numberOfRows(inSection: selectedIndexPath.section) > 0 {
        tableView.scrollToRow(at: selectedIndexPath, at: .top, animated: false)
    }
}
1
Vadim Bulavin

スクロールをテストするのに十分なダミーの連絡先が追加されていますか? tableViewが特定のサイズである場合にのみ、iPhoneはスクロールするインプットを見つけます。

これは私のプロジェクトで機能するコードです。前のボタンを使用するので、テーブルビューを少し下にスクロールして、通常UITABLEVIEWSCROLLPOSITIONを使用します。 (前のセルを「見る」ことができない場合、前のボタンは機能しません。

カスタムメソッド呼び出しの一部を無視します。

- (void)textFieldDidBeginEditing:(UITextField *)textField {

    //Show the navButtons
    [self navButtonAnimation];


    DetailsStandardCell *cell = (DetailsStandardCell *)textField.superview.superview.superview;

    self.parentController.lastCell = cell;


    //Code to scroll the tableview to the previous indexpath so the previous button will work. NOTE previous button only works if its target table cell is visible.
    NSUInteger row = cell.cellPath.row;
    NSUInteger section = cell.cellPath.section;

    NSIndexPath *previousIndexPath = nil;


    if (cell.cellPath.row == 0 && cell.cellPath.section != 0) //take selection back to last row of previous section
    {
    NSUInteger previousIndex[] = {section -1, ([[self.sections objectForKey:[NSNumber numberWithInt:section - 1]]count] -1)};
    previousIndexPath = [[NSIndexPath alloc] initWithIndexes:previousIndex length:2];   
    }
    else if (cell.cellPath.row != 0 && cell.cellPath.section != 0)
    {
        NSUInteger previousIndex[] = {section, row - 1};
        previousIndexPath = [[NSIndexPath alloc] initWithIndexes:previousIndex length:2];       

    }


    [self.theTableView scrollToRowAtIndexPath: cell.cellPath.section == 0 ? cell.cellPath : previousIndexPath atScrollPosition:UITableViewScrollPositionTop animated:YES];

}
0
Dan Morgan