2010-04-21 7 views
7

Tôi đang sử dụng iPhone SDK 3.1.3. Tôi có một số UITableViewController nhận dữ liệu từ một bộ điều khiển khác. Chế độ xem bảng được thêm dưới dạng chế độ xem phụ vào chế độ xem chính nhưng khung được đặt để không hiển thị. Khung xem bảng được cập nhật và được thực hiện để trượt qua chế độ xem chính bằng cách nhấn vào nút.Cuộn UITableView đến vị trí cụ thể

Chế độ xem bảng xuất hiện và tôi cuộn đến hàng cuối cùng. Nếu tôi chọn hàng cuối cùng, tôi tải lại bảng với nhiều dữ liệu hơn. Bảng được cập nhật với nhiều dữ liệu hơn. Mọi thứ hoạt động tốt ngoại trừ vị trí cuộn luôn ở trên cùng.

Tôi cần vị trí cuộn là hàng cuối cùng mà tôi đã nhấp vào để tải thêm dữ liệu. Tôi lưu vị trí cuộn và gọi mã sau đây sau khi tải thêm dữ liệu. Nó thực hiện mà không có vấn đề nhưng vị trí di chuyển luôn luôn là đầu trang.

[theTableView scrollToRowAtIndexPath:[NSIndexPath indexPathForRow:savedScrollPosition inSection:0] atScrollPosition:savedScrollPosition animated:NO]; 

Điều trên dường như không có hiệu lực. ViewWillAppear:ViewDidAppear: không kích hoạt và tôi được thông báo rằng nếu bộ điều khiển chế độ xem được khởi tạo trong mã, trường hợp này không kích hoạt. Xin vui lòng giúp tôi tìm ra cách và khi nào để thiết lập vị trí di chuyển sau khi bảng được tải lại ([theTableView reloadData]) để nó ở hàng mà tôi nhấp vào.

Mã để Nạp lại bảng điểm & cuộn

////performAction will notify the tableviewcontroller which will result in didPerformAction being called 
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { 
    if (indexPath.row == lastRow) 
    { 
     savedScrollPosition = lastRow; 
     //perform the action 
     [controller performAction]; 
    } 
} 

- (void) didPerformAction:(NSNotification *)obj 
{ 
    [theTableView reloadData]; 
    [theTableView 
    scrollToRowAtIndexPath: [NSIndexPath indexPathForRow:savedScrollPosition inSection:0] 
    atScrollPosition:UITableViewScrollPositionBottom 
    animated:NO]; 
} 

Trả lời

28

này dường như làm các trick.

[theTableView scrollToRowAtIndexPath:[NSIndexPath indexPathForRow:savedScrollPosition inSection:0] atScrollPosition:UITableViewScrollPositionTop animated:NO]; 
CGPoint point = theTableView.contentOffset; 
point .y -= theTableView.rowHeight; 
theTableView.contentOffset = point; 
+2

những gì được lưuScrollPosition trong tuyên bố này –

0

Nếu đó là mã thực tế và giả định theTableView không phải là con số không ở đó, bạn nên nhận được một cảnh báo nói rằng "có thể không đáp ứng với ..." vì scrollToRowAtIndexPath là đánh vần sai.

Thứ hai, tham số atScrollPosition mong đợi giá trị enum UITableViewScrollPosition cho biết vị trí trên màn hình bạn muốn đặt hàng mục tiêu.

Hãy thử điều này:

[theTableView scrollToRowAtIndexPath: 
       [NSIndexPath indexPathForRow:savedScrollPosition inSection:0] 
       atScrollPosition:UITableViewScrollPositionBottom 
       animated:NO]; 
+0

xin lỗi đó là lỗi đánh máy. Tôi đã chỉnh sửa nó. tốt, tôi không muốn cuộn xuống dưới cùng. Tôi cần phải di chuyển đến hàng mà tôi nhấp vào đó là loại trung nhưng không phải là giữa mọi lúc. Tuy nhiên, tôi đã thử điều này và kỳ lạ, nó vẫn ở trên đỉnh. – Dave

+0

Hiển thị phương thức mà nơi này được gọi. Đặt NSLogs trước cuộc gọi hiển thị giá trị của savedScrollPosition. atScrollPosition không tham chiếu đến số hàng nhưng đến vị trí tương đối hiện tại của nó trên màn hình. – DyingCactus

+0

oh tôi hiểu rồi. tôi đã cập nhật mã. – Dave

10

Nó sẽ trông đẹp hơn và vị trí cuộn cố định sẽ ở lại nếu bạn có thể chèn các hàng thay vì gọi reloadData.

[theTableView beginUpdates]; 
[theTableView insertRowsAtIndexPaths:indexPaths withRowAnimation:animation]; 
// make sure the dataSource will return new rows before calling endUpdates 
[theTableView endUpdates]; 

Thay vì sử dụng UITableView di chuyển bạn có thể sử dụng UIScrollView di chuyển:

savedOffset = [theTableView contentOffset]; 

Sau đó khôi phục:

[theTableView setContentOffset:savedOffset]; 
+0

oh cảm ơn, tôi vừa đăng câu trả lời gần như giống với bạn, thiết lập contentOffset. Cảm ơn bạn đã chèn mẹo hàng. – Dave