2011-10-22 3 views
8

iOS 5 cuối cùng đã thêm phương thức moveRowAtIndexPath:toIndexPath: vào UITableView. Vấn đề là, gọi nó chỉ di chuyển hàng, nó không cập nhật/vẽ lại nó. Cách duy nhất để làm như vậy có vẻ là bằng cách tìm ô và gọi setNeedsDisplay trực tiếp. Nhưng điều này là khó khăn vì bạn không bao giờ biết liệu các tế bào đã được di chuyển hay không.moveRowAtIndexPath không làm mới nội dung của ô

Tôi không thể gọi số reloadRowsAtIndexPaths:, vì tôi không được phép áp dụng 2 hình động cho một hàng trong cùng một khối beginUpdates-endUpdates.

Có thể có các cách giải quyết khác nhau mà tôi có thể nghĩ đến, như tách toàn bộ nội dung thành 2 khối hoạt ảnh. Nhưng tôi tự hỏi liệu tôi có thiếu cái gì đó không, vì toàn bộ hành vi có vẻ lạ lùng với tôi.

+0

Không chắc chắn, nhưng hãy thử và xem 'beginUpdates' và 'endUpdates'. Bạn có thể theo dõi indexPath đang được di chuyển và thực hiện thay đổi thích hợp cho ô trong 'endUpdates' nếu nó đã được di chuyển. – runmad

+0

Gọi bất kỳ chức năng hoạt ảnh hàng mới sau khi endUpdates hủy bỏ các hình ảnh động đang chờ xử lý cho ô đó. Nói cách khác, các tế bào không được vẽ lại nhưng hoạt hình di chuyển không diễn ra nữa. Gọi 'setNeedsDisplay' có hiệu ứng tương tự. – samvermette

+0

Đã gửi báo cáo lỗi cho nó: http://openradar.appspot.com/10457435 – samvermette

Trả lời

14

Cuối cùng nhận được một câu trả lời chính thức từ Apple về vấn đề này:

kỹ thuật đã xác định rằng vấn đề này cư xử như dự định dựa trên các thông tin sau:

Chỉ chèn và cập nhật gây ra các tế bào được được yêu cầu từ nguồn dữ liệu (đầu tiên bởi vì nó mới và thứ hai vì bạn đã thông báo rõ ràng chế độ xem bảng để cập nhật ô). Xóa và di chuyển không cập nhật nội dung vì nội dung đó không ẩn trong hành động đang được thực hiện. Nếu bạn cần thay đổi nội dung của ô trong khi cập nhật, chỉ cần truy cập vào ô và thay đổi nội dung.

2

Họ thích gây khó khăn cho chúng tôi làm không họ ;-)

case NSFetchedResultsChangeUpdate: 
     [self configureCell:[tableView cellForRowAtIndexPath:indexPath] atIndexPath:indexPath]; 
     break; 

    case NSFetchedResultsChangeMove: 
     // old API 
     //[tableView deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationFade]; 
     //[tableView insertRowsAtIndexPaths:@[newIndexPath] withRowAnimation:UITableViewRowAnimationFade]; 

     // new API 
     [self configureCell:[tableView cellForRowAtIndexPath:indexPath] atIndexPath:newIndexPath]; // note use of newIndexPath 
     [tableView moveRowAtIndexPath:indexPath toIndexPath:newIndexPath]; // NS_AVAILABLE_IOS(5_0); 
     break; 

Lưu ý trong ChangeMove, configureCell có params khác so với việc sử dụng nó trong ChangeUpdate vì vậy hãy cẩn thận nếu copy dán. Khá khó khăn để có được quyền đó.