2013-04-20 32 views
8

Tôi có UICollection trong đó sẽ có số lượng Học sinh và mỗi mục có công tắc bên trong nó được sử dụng để ghi điểm. Tôi lặp qua tất cả các ô hiển thị như thế này.lặp qua tất cả các ô trong UICollectionview

for(attendancecollectionViewCell* cells in [[self collectionView] visibleCells]){ 

    NSLog(@"The switch value : %c",cells.attendanceSwitchLabel.isOn); 

} 

Nhưng, tôi muốn lặp qua tất cả các ô để tham dự, không chỉ các ô hiển thị.

+0

Trừ khi bạn cần thao tác các ô, bạn nên lặp qua nguồn dữ liệu mà từ đó các ô được định cấu hình. –

Trả lời

13

Bạn không thể lặp qua các ô không hiển thị vì các ô đó không tồn tại. UICollectionView, giống như UITableView, tái sử dụng các tế bào ngay sau khi chúng được tắt màn hình. Tức là, nếu bạn di chuyển xuống, sẽ mất một ô đã được cuộn ra và sử dụng nó cho ô "mới" sắp được cuộn vào chế độ xem.

Nếu bạn muốn giữ trạng thái cho một mục nhập trong bộ sưu tập của mình, bạn sẽ phải lưu trữ nó riêng biệt với chính ô đó. Ví dụ, một NSArray của các cấu trúc (hoặc các NSObjects tùy chỉnh) ánh xạ tới giá trị indexPath.row.

Câu hỏi quan trọng hơn đối với bạn cụ thể là: Bạn đang cố gắng đạt được điều gì trong vòng lặp của bạn?

Hãy cho tôi biết nếu bạn cần thêm thông tin hoặc mã mẫu.

+0

Tôi nghĩ rằng ví dụ hợp lệ về việc muốn truy cập vào các ô không hiển thị - câu hỏi của tôi về điều này là ở đây nếu bạn có một http://stackoverflow.com/questions/33259244/how-to-redraw-non-visible-uicollectionviewcells -after-rotation-ready-for-when-r – Greg

+3

"vì các ô đó không tồn tại": điều này không đúng. Các tế bào tồn tại khi chúng được tái sử dụng. Chúng tồn tại và đang chờ để được tái sử dụng. Nhưng tôi có bằng chứng tái sản xuất, nơi các tế bào KHÔNG ở trong visibleCells và được sử dụng một lần nữa (ví dụ: không có một cuộc gọi đến DequeueReusableCell). – Softlion

+4

@Softlion Tôi gặp vấn đề tương tự. Hóa ra đó là một điều iOS10, nơi các tế bào ở lại xung quanh đôi khi thậm chí sau khi ra khỏi màn hình. Bạn có thể tắt hành vi này bằng cách thực hiện '' 'collectionView.prefetchingEnabled = NO''' – alemangui