2009-06-15 39 views
16

Tôi có một UITableView với pagingEnabled. Mỗi ô sẽ chiếm diện tích xem của bảng. Có nghĩa là, mỗi ô có chiều cao và chiều rộng giống như bảng. Tôi đang sử dụng các ô tùy chỉnh có thuộc tính tên. Tôi muốn hiển thị tên của ô hiện tại (có thể xem) trong nhãn. Điều này làm việc tốt cho các tế bào đầu tiên và cuối cùng nhưng bất cứ điều gì inbetween không phải là dễ dàng như vậy. Vấn đề là cellForRowAtIndexPath được gọi hai lần cho các ô giữa này. Dưới đây là hình thức di chuyển từ ô đầu tiên đến ô cuối cùng và sau đó quay lại. Tôi đã liệt kê các chỉ số theo thứ tự như vụ cháy cellForRowAtIndexPath cho hàng đó:Nhận ô hiển thị từ UITableView pagingEnabled

Row    indexPath.row 
0     0   //view loads and table appears 
1     1,2  //user scrolls to second cell. cellForRowAtIndexPath fires twice. First time indexPath.row is one and second time it is two. This causes cell two's name to display in the label, rather than cell one. 
2     2,3 
3     3 
//user starts scrolling back to first cell 
2     1,2 
1     1,0 
0     0 

tôi có thể thiết lập sử dụng một đối tượng NSDate để phát hiện nếu anh ở một hàng trung lưu. Bằng cách phân biệt thời gian trước với hiện tại, tôi sẽ biết. Tuy nhiên, nếu người dùng cuộn nhanh qua các ô, điều đó có thể không hoạt động. Có cách nào khác để làm điều đó không?

Tôi đã thử sử dụng các biến thể của thuộc tính visiblecells nhưng không hiệu quả. UITableView sẽ tải ô tiếp theo ngay cả khi nó không hiển thị, khiến nó trở thành một phần của các ô hiển thị.

Trả lời

44

Vâng, nếu bạn không bao giờ tìm ra giải pháp hoặc cho bất kỳ ai đến câu hỏi này, tôi sẽ cung cấp cho bạn câu trả lời bạn đang tìm kiếm. UITableView sẽ cung cấp cho bạn với indexPaths bạn đang tìm kiếm, và sau đó UITableView sẽ hạnh phúc cung cấp cho bạn với các tế bào phù hợp với những đường chỉ số:

UITableView *tableView = self.tableView; // Or however you get your table view 
NSArray *paths = [tableView indexPathsForVisibleRows]; 

// For getting the cells themselves 
NSMutableSet *visibleCells = [[NSMutableSet alloc] init]; 

for (NSIndexPath *path in paths) { 
    [visibleCells addObject:[tableView cellForRowAtIndexPath:path]]; 
} 

// Now visibleCells contains all of the cells you care about. 
+1

Vấn đề duy nhất với điều này là chúng không được sắp xếp ... có cách nhanh chóng để sắp xếp chúng hay thêm chúng vào mảng đúng thứ tự không? –

+0

+1 câu trả lời này cũng là câu hỏi của tôi. –

+21

bạn cũng có thể nhận được các ô hiển thị với [tableView visibleCells]; – George

2

Thay vì tập trung vào khi UITableView yêu cầu một ô, bạn nên tập trung vào khi nó hiển thị ô, được biểu thị bằng phương thức ủy nhiệm tableView:willDisplayCell:forRowAtIndexPath.

+0

willDisplayCell yeilds cùng kết quả tôi đã đăng. – 4thSpace

2

Converted Douglas ví dụ để Swift:

let tableView = self.tableView // Or however you get your table view 
let paths = tableView.indexPathsForVisibleRows 

// For getting the cells themselves 
let visibleCells : NSMutableSet = [] 

for path in paths! { 
    visibleCells.addObject(tableView.cellForRowAtIndexPath(path)!) 
} 
0

Đơn giản và cách thanh lịch để lấy tế bào hữu hình của UITableView, không cần phải có được các tế bào có thể nhìn thấy bằng cách sử dụng các giá trị indexpath

NSArray * visibleCells = tableView.visibleCells; 
NSLog(@"Total visible Cells: %i", [visibleCells count]); 

NếuCần cócác ô hiển thị

NSArray * paths = [tableView indexPathsForVisibleRows]; 
Các vấn đề liên quan