2010-01-15 8 views
6

Tôi có UITableView với kiểu "Được nhóm" mà tôi sử dụng để đặt một số tùy chọn trong Ứng dụng của mình. Tôi muốn cho một trong các ô của UITableView này chỉ hiển thị tùy thuộc vào việc một ô của UITableView này có được kích hoạt hay không. Nếu không, ô đầu tiên sẽ hiển thị (tốt nhất là với một hình động trơn tru), nếu có, ô đầu tiên sẽ ẩn.Tôi có thể hiển thị/ẩn một ô nhất định trong UITableView tùy thuộc vào trạng thái của ô khác không?

Tôi đã thử trả lại nil trong -tableView:cellForRowAtIndexPath: thích hợp để ẩn ô, nhưng điều đó không hoạt động và thay vào đó sẽ ném ngoại lệ.

Tôi hiện đang bị kẹt và không có ý tưởng về cách giải quyết vấn đề này, vì vậy tôi hy vọng một số bạn có thể chỉ cho tôi đúng hướng.

Trả lời

9

Dưới đây là một bài có ích trong đó tác giả đưa ra một số mã nguồn để thực hiện các hình ảnh động trên các tế bào hiện đang được chọn:

http://iphonedevelopment.blogspot.com/2010/01/navigation-based-core-data-application.html

Ông đang sử dụng điều này trong một bối cảnh NSFetchedResultsController, nhưng bạn có thể thấy cách anh ta sử dụng các cuộc gọi khác nhau để thêm/xóa các ô & phần.

Bây giờ, trong trường hợp của bạn, bạn sẽ cần phải sửa đổi bất cứ điều gì mảng bạn đang sử dụng để lưu trữ các dữ liệu sử dụng để tạo ra các hàng trong tableView của bạn khi bạn "kích hoạt" di động của bạn, sau đó chọn lọc sử dụng:

  • tableView: insertRowsAtIndexPaths: withRowAnimation:
  • tableView: deleteRowsAtIndexPaths: withRowAnimation:
  • tableView: insertSections: withRowAnimation:
  • tableView: deleteSections: withRowAnimation:

để điều chỉnh cho phù hợp (bạn có thể bắt đầu với tableView: reloadData :, nhưng không hiệu quả).

Tôi nhận thấy rằng API có thể hơi khó khăn, nhưng dành thời gian để đọc qua và hiểu những gì các cuộc gọi khác nhau thực hiện. Hiểu cách UITableView sử dụng nguồn dữ liệu và ủy nhiệm của nó, cũng như chuỗi các sự kiện xảy ra khi các ô được chọn/xóa/v.v., là quan trọng nếu bạn muốn có được những thứ vừa phải (và không có sự cố).

+0

+1 Liên kết đó trông thú vị. – gerry3

+0

Cảm ơn, tôi đã tìm ra nó với sự trợ giúp của bài đăng của bạn! :) –

9

Bạn nên xóa dữ liệu đằng sau các ô ẩn khỏi nguồn dữ liệu của chế độ xem bảng.

Ví dụ: nếu bạn đang sử dụng mảng, khi một hành động xảy ra khiến cho ô bị ẩn, bạn sẽ xóa đối tượng cho hàng đó khỏi mảng. Sau đó, là nguồn dữ liệu của chế độ xem bảng, mảng sẽ trả lại tổng số ít hơn và chỉ trả về các ô hợp lệ cho mỗi hàng trong số đó (không có nil).

Cách tiếp cận này có thể yêu cầu duy trì một mảng thứ hai với tất cả các đối tượng (bao gồm cả ẩn).

Để cập nhật chế độ xem, hãy xem reloadRowsAtIndexPaths:withRowAnimation:.

+0

Cảm ơn bạn, điều này cũng hữu ích. Ngay sau khi danh tiếng của tôi cho phép, tôi sẽ upvote điều này. –

2
[tableView beginUpdates]; 
[tableView deleteRowsAtIndexPaths:withRowAnimation:]; // or insertRowsAtIndexPaths:withAnimation: 
[tableView endUpdates]; 
+0

Chỉ là những gì tôi cần. – To1ne

0

Trước khi cellForRowAtIndexPath được gọi, numberOfRowsInSection được gọi. Bạn nên trả về giá trị thích hợp của các ô trong phần đó, vì vậy nếu bạn chỉ muốn hiển thị 1 ô, hãy trả về một ô. Logic gì các tế bào được hiển thị phải được thực hiện một phần trong cả hai phương pháp