2009-08-23 34 views
5

Tôi đang có một UITableView với xen kẽ màu UITableViewCells. Và bảng có thể được chỉnh sửa: các hàng có thể được sắp xếp lại và xóa. Làm cách nào để cập nhật màu nền của ô xen kẽ, khi các hàng được sắp xếp lại hoặc bị xóa?Cập nhật xen kẽ màu UITableViewCells khi các hàng được sắp xếp lại hoặc bị xóa

Tôi đang sử dụng này để vẽ các tế bào màu xen kẽ:

- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath { 
    if ([indexPath row] % 2) { 
     // even row 
     cell.backgroundColor = evenColor; 
    } else { 
     // odd row 
     cell.backgroundColor = oddColor; 
    } 
} 

Nhưng phương pháp này không được gọi khi một hàng được sắp xếp lại hoặc xóa. Và tôi không thể gọi [tableView reloadData] từ phương pháp sau đây, bởi vì nó bị treo ứng dụng trong một vòng lặp vô hạn:

- (void)tableView:(UITableView *)tableView moveRowAtIndexPath:(NSIndexPath *)fromIndexPath toIndexPath:(NSIndexPath *)toIndexPath { 
    // Move the object in the array 
    id object = [[self.list objectAtIndex:[fromIndexPath row]] retain]; 
    [self.list removeObjectAtIndex:[fromIndexPath row]]; 
    [self.list insertObject:object atIndex:[toIndexPath row]]; 
    [object release]; 

    // Update the table ??? 
    [tableView reloadData]; // Crashes the app in an infinite loop!! 
} 

Không ai có một con trỏ hoặc một giải pháp thực hành tốt nhất để đối phó với vấn đề sắp xếp lại các tế bào màu xen kẽ?

Cảm ơn

Trả lời

5

sử dụng một cuộc gọi chậm để thực hiện tải lại nếu bạn không thể gọi từ phương pháp đó:

[tableView performSelector:@selector(reloadData) withObject:nil afterDelay:0.0f]; 

Nó chờ đợi cho đến sau khi phương pháp hiện tại của bạn được hoàn tất trước khi nó gọi tải lại.

+0

Cảm ơn! Điều đó làm các trick. –

0

[tableView reloadData] sẽ nhận được nền bảng của bạn trở lại trong swing của sự vật. Tùy chọn khác của bạn là trao đổi màu nền của tất cả các ô hiển thị từ indexPath của chỉ mục thấp hơn khi di chuyển lên đến mức cao nhất trong visibleCells.

3

Tải lại quá nặng; Tôi đã viết AltTableViewController chỉ thay đổi màu nền của ô và nó sẽ hoạt động nhanh hơn.

+0

Cảm ơn, điều đó đã hiệu quả! –

1

Tôi lấy tất cả các bản xem trước UITableViewCell từ bảng nhìn và sắp xếp mảng đó dựa trên các ô frame.origin.y để chúng trở lại theo thứ tự đúng. Sau đó, tôi lặp qua việc thay đổi màu nền dựa trên chỉ mục == 0 || index% 2 == 0 tái tô màu chúng. Dường như làm việc tốt hơn tải lại tableView vì điều đó đã khiến hoạt ảnh bị giật. Làm việc cho tôi lúc 1:25 AM

4

Không cần sử dụng các đối tượng của bên thứ ba hoặc tải lại/làm mới toàn bộ nguồn dữ liệu. Chỉ cần sử dụng đúng công cụ trong con dao thụy sĩ của bạn:

- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath { 
    if(editingStyle == UITableViewCellEditingStyleDelete) { 
     //1. remove your object 
     [dataSource removeObjectAtIndex:indexPath.row]; 

     //2. update your UI accordingly 
     [self.myTableView beginUpdates]; 
     [self.myTableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationRight]; 
     [self.myTableView endUpdates]; 

     //3. obtain the whole cells (ie. the visible ones) influenced by changes 
     NSArray *cellsNeedsUpdate = [myTableView visibleCells]; 
     NSMutableArray *indexPaths = [[NSMutableArray alloc] init]; 
     for(UITableViewCell *aCell in cellsNeedsUpdate) { 
      [indexPaths addObject:[myTableView indexPathForCell:aCell]]; 
     } 

     //4. ask your tableview to reload them (and only them) 
     [self.myTableView reloadRowsAtIndexPaths:indexPaths withRowAnimation:UITableViewRowAnimationNone]; 

    } 
} 
+1

'NSArray * indexPaths = [self.tableView indexPathsForVisibleRows];' giúp bạn tiết kiệm từ một vòng lặp không cần thiết. – user3099609

0

Điều này hoạt động tốt. Bắt đầu mô hình ở chỉ mục cuối cùng chứ không phải là chỉ mục đầu tiên. Bằng cách đó, mỗi ô luôn giữ nguyên nền của nó:

if (dataSource.count - indexPath.row) % 2 == 0 { 
     cell.backgroundColor = UIColor.grayColor() 
    } else { 
     cell.backgroundColor = UIColor.whiteColor() 
    } 

Tôi đã thử các giải pháp khác, nhưng không hoàn toàn hài lòng. Giải pháp này không phải là một hack và thậm chí không thêm một dòng mã.

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