2009-05-08 29 views
5

Một số trợ giúp sẽ được đánh giá cao ở đây!Vấn đề làm mới tế bào UITableView về sắp xếp lại

Tôi có ô UITableView tùy chỉnh, bao gồm hình ảnh (xanh lục, cam hoặc đỏ) và hai nhãn ở các kích thước phông chữ khác nhau. UITableView được điều khiển bởi một NSMutableArray của các đối tượng.

UITableView được chia thành ba phần, với phần đầu tiên chứa tất cả các ô có hình ảnh màu đỏ, phần thứ hai có phần màu cam, thứ ba có màu xanh lục.

Tôi đã triển khai khả năng sắp xếp lại các ô trong UITableView, cho phép người dùng kéo, nói, một mục có hình ảnh màu đỏ từ phần màu đỏ vào phần màu da cam. Thao tác kéo này hoạt động tốt và dữ liệu cơ bản được cập nhật chính xác. Tôi biết đây là trường hợp bởi vì nếu tôi chọn các tế bào, tôi đi đến xem chi tiết của nó và dữ liệu được cập nhật.

Tuy nhiên, UITableView không cập nhật cho đến khi tôi đi đến chi tiết (hoặc thoát khỏi ứng dụng) và quay lại! Nó cũng cập nhật nếu tôi di chuyển ô vi phạm ra khỏi chế độ xem và quay lại chế độ xem một lần nữa, do đó mảng rõ ràng chứa dữ liệu chính xác. Tôi chỉ không thể kích hoạt chế độ xem làm mới!

Tôi đã thử những điều sau đây sau khi mã của tôi để thay đổi dữ liệu cơ bản trong moveRowAtIndexPath:

[self.tableView reloadData]; 

Tuy nhiên điều này gây ra một ngoại lệ. Tài liệu tham khảo ngôn ngữ của Apple trong thực tế nói rằng reloadData không thể được gọi khi chèn, xóa hoặc hoạt hình, đó là tất nhiên những gì tôi đang làm. Ngoài ra, chỉ cố gắng làm mới ô bằng

[self setNeedsDisplay]; 

không hoạt động (mặc dù nó không bị hỏng).

Bất kỳ ý tưởng nào về cách tôi có thể làm mới UITableView? Tôi không thể tìm thấy một phương thức afterMoveHasBeenCompleted: hoặc bất cứ thứ gì, vì vậy nếu tôi không thể gọi reloadData trong phương thức moveRowAtIndexPath: thì tôi gọi nó ở đâu?

Trả lời

4

OK!

Tôi phát hiện ra giải pháp là đặt chậm trễ trong mã làm mới, điều này đã ngăn chặn nó bị lỗi.

tôi đặt cuộc gọi reloadData thành một phương pháp riêng biệt:

- (void)refreshDisplay:(UITableView *)tableView { 
[tableView reloadData]; } 

và sau đó gọi nó với một sự chậm trễ thứ hai 0,5:

[self performSelector:(@selector(refreshDisplay:)) withObject:(tableView) afterDelay:0.5]; 

Và nó đã không sụp đổ và thay vào đó làm mới! Độ trễ 0,5 giây hầu như không đáng chú ý và hoàn toàn có thể chấp nhận được.

Hy vọng điều này sẽ giúp người khác!

Cảm ơn

Phil

+3

Hoặc đây chỉ là một hack bẩn? Có phương pháp "animationComplete" tôi có thể sử dụng thay thế không? ... – h4xxr

+0

Điều đó có vẻ là cách tốt nhất để làm điều đó, theo bài đăng của gpmoore về chuỗi nhà phát triển Apple này: http://discussions.apple.com/thread.jspa ? messageID = 8450874 – Tim

+0

Đó là bực bội nhưng rất yên tâm! Cảm ơn! – h4xxr

2

Hãy xem tham chiếu cho UITableViewDelegate. Nếu bạn gán cho UITableView một đại biểu, bạn có thể sử dụng các phương thức của nó để xử lý các thông báo rằng chế độ xem bảng của bạn đã làm điều gì đó. Có thể bạn sẽ sử dụng một trong số

tableView:didEndEditingRowAtIndexPath:
hoặc
tableView:targetIndexPathForMoveFromRowAtIndexPath:toProposedIndexPath:
để thực hiện việc này.

+0

Thật không may, tableView: didEndEditingRowAtIndexPath dường như chỉ để kích hoạt sau khi hủy các "phụ swipe" hành động. Ngay cả khi tôi có thể theo dõi điểm mà tại đó chỉnh sửa đã kết thúc (tức là khi người dùng nhấp vào "xong"), hình ảnh vẫn sẽ bị sai cho đến thời điểm đó. Phương pháp khác bạn đề xuất tôi đã sử dụng để cho phép kéo và thả vào các phần khác. Điều này đã trôi qua trước khi tôi biết liệu tôi có cần làm mới hay không. – h4xxr

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