2011-11-24 27 views
31

một câu hỏi đơn giản nhưng dường như tôi không có thuật ngữ đúng để tìm kiếm Stackoverflow của nó.Phát hiện ô trên cùng hiện tại trong UITableView sau khi cuộn

Tôi có một UITableView không có phần nào, người dùng có thể cuộn lên và xuống danh sách dài dữ liệu (hàng) được trình bày bên trong tableview này.

Câu hỏi: làm cách nào tôi có thể phát hiện số dòng ô trên cùng nhất sau khi người dùng cuộn. (ví dụ: nếu người dùng đang cuộn xuống 30 ô, ô trên cùng sau cuộn là = 30)

Trả lời

59

Bạn có thể thử sử dụng UITableView 's -indexPathsForVisibleRows hoặc -indexPathForRowAtPoint.

Ví dụ: giả sử bạn muốn in indexPath của ô hiển thị trên cùng, khi bạn dừng kéo bảng. Bạn có thể làm một cái gì đó như thế này:

- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate{ 
    NSIndexPath *firstVisibleIndexPath = [[self.tableView indexPathsForVisibleRows] objectAtIndex:0]; 
    NSLog(@"first visible cell's section: %i, row: %i", firstVisibleIndexPath.section, firstVisibleIndexPath.row); 
} 

Đối Swift 3,0

let topVisibleIndexPath:IndexPath = self.tableView.indexPathsForVisibleRows![0] 
+2

tôi sẽ sắp xếp mảng như không có gì (như xa như tôi có thể nhìn thấy) trong tài liệu nói rằng chỉ số đường dẫn được sắp xếp theo thứ tự tăng dần. – jbat100

+0

Điểm rất tốt, tôi upvoted câu trả lời của bạn (ngay cả khi thử nghiệm nhanh của tôi dường như trả lại ô trên cùng trong mục mảng đầu tiên ..) – phi

+1

Đó là một câu hỏi khác, nhưng hãy kiểm tra 'tableView scrollToRowAtIndexPath' – phi

29

Bạn nhận được các đường dẫn chỉ mục cho các hàng có thể nhìn thấy

NSArray* indexPaths = [tableView indexPathsForVisibleRows]; 

sau đó sắp xếp sử dụng compare:

NSArray* sortedIndexPaths = [indexPaths sortedArrayUsingSelector:@selector(compare:)]; 

Sau đó nhận được hàng là yếu tố đầu tiên của

NSInteger row = [(NSIndexPath*)[sortedIndexPaths objectAtIndex:0] row]; 
+0

Giải pháp này hoạt động trên 'UICollectionView' cùng với 'UITableView's – aytunch

6

Đây là mã Swift 3:

override func scrollViewDidEndDragging(_ scrollView: UIScrollView, willDecelerate decelerate: Bool) { 
    let firstVisibleIndexPath = self.tableView.indexPathsForVisibleRows?[0] 
    print("First visible cell section=\(firstVisibleIndexPath?.section), and row=\(firstVisibleIndexPath?.row)") 
} 
+0

Chức năng này được gọi liên tục, tôi nghĩ câu trả lời tốt hơn cho câu hỏi ban đầu là scrollViewDidEndDecelerating hoặc scrollViewDidEndDragging –

+0

Hi @WilliamT. Tôi đã cập nhật câu trả lời của mình. Bạn có thể loại bỏ downvote? – mathema

Các vấn đề liên quan