2010-07-13 34 views

Trả lời

21

Triển khai phương thức tableView:willDisplayCell:forRowAtIndexPath: trong UITableViewDelegate của bạn và kiểm tra xem đó có phải là hàng cuối cùng không.

+1

cảm ơn mẹo. Tôi đang thực sự sử dụng phương pháp này để kích hoạt một sự kiện và có vẻ như nó là "Will" hiển thị, nó xảy ra trước khi nó thực sự hiển thị các tế bào. Có phương pháp nào phát sinh sau khi ô được hiển thị không? – Ward

+0

Than ôi, không. Bạn có thể fudge một chút bằng cách sử dụng 'performSelector: withObject: afterDelay' với một sự chậm trễ rất ngắn để gọi một phương thức làm những gì bạn cần. –

+0

@ArtGillespie Tìm thấy chính xác những gì tôi đang tìm kiếm. Chúc mừng! –

37

Bên tableView:cellForRowAtIndexPath: hoặc tableView:willDisplayCell:forRowAtIndexPath: như thế này:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 

    ... 

    NSInteger sectionsAmount = [tableView numberOfSections]; 
    NSInteger rowsAmount = [tableView numberOfRowsInSection:[indexPath section]]; 
    if ([indexPath section] == sectionsAmount - 1 && [indexPath row] == rowsAmount - 1) { 
     // This is the last cell in the table 
    } 

    ... 

} 
+0

bạn có thể cũng đã nói tôi là một giả. cảm ơn vì sự giúp đỡ đôi khi tôi nghĩ những điều này khó hơn họ. – Ward

+3

numberOfSections gọi số nguồn dữ liệuOfSectionsInTableXem và numberOfRowsInSection số nguồn dữ liệu cuộc gọiOfRowsInSection. Và trong thực hiện của tôi nó đã bị rơi cho thấy đăng nhập đệ quy này thực hiện. –

14
- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath { 
    NSInteger lastSectionIndex = [tableView numberOfSections] - 1; 
    NSInteger lastRowIndex = [tableView numberOfRowsInSection:lastSectionIndex] - 1; 
    if ((indexPath.section == lastSectionIndex) && (indexPath.row == lastRowIndex)) { 
     // This is the last cell 
    } 
} 
1

Đối với Xcode 8 và nhanh chóng 3

func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) { 
     let lastSectionIndex = tableView.numberOfSections - 1 
     let lastRowIndex = tableView.numberOfRows(inSection: lastSectionIndex) - 1 
     if indexPath.section == lastSectionIndex && indexPath.row == lastRowIndex { 
      print("this is the last cell") 
     } 
    } 
2

Đối với Xcode 8 và Swift3

//Show Last Cell (for Table View) 
func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) 
{ 
    if indexPath.row == (yourdataArray.count - 1) 
    { 
     print("came to last row") 
    } 
} 

//Show last cell (for Collection View) 
func collectionView(_ collectionView: UICollectionView, willDisplay cell: UICollectionViewCell, forItemAt indexPath: IndexPath) 
{ 
    if indexPath.row == (yourdataArray.count - 1) 
    { 
     // Last cell is visible 
    } 
} 
3

Tạo mở rộng thanh lịch cho UITableView:

extension UITableView { 

    func isLast(for indexPath: IndexPath) -> Bool { 

     let indexOfLastSection = numberOfSections > 0 ? numberOfSections - 1 : 0 
     let indexOfLastRowInLastSection = numberOfRows(inSection: indexOfLastSection) - 1 

     return indexPath.section == indexOfLastSection && indexPath.row == indexOfLastRowInLastSection 
    } 
} 

Ví dụ về sử dụng:

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 

    if tableView.isLast(for: indexPath) { 
     //do anything then 
    } 

    return cell 
} 
0

tôi đã có một số vấn đề với phương pháp willDisplayCell. Điều này phù hợp với tôi:

func scrollViewDidScroll(_ scrollView: UIScrollView) { 
    let y = scrollView.contentOffset.y/(scrollView.contentSize.height - scrollView.frame.size.height) 
    let relativeHeight = 1 - (table.rowHeight/(scrollView.contentSize.height - scrollView.frame.size.height)) 
    if y >= relativeHeight{ 
     print("last cell is visible") 
    } 
} 

Chỉ cần chuyển điều này theo phương pháp đại biểu và thay đổi 'bảng' thành bảng của bạnXem.

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