【iOS開發】解決UITableview中選中Cell後,Cell複用導致選中狀態消失、應用閃退的問題

KyXu發表於2015-07-15

如圖,是一個可以多項選擇的 UITableview,但是因為 iOS 的 Cell 複用機制,即下面的 reuseIdentifier 部分

let cell:UITableViewCell=UITableViewCell(style:UITableViewCellStyle.Subtitle, reuseIdentifier:”髮型cell”)

導致 UITableViewCell 的 UITableViewCellAccessoryType,在點選之後可以更改為 Checkmark狀態,但是當頁面滾動至不可見某個Cell,再滾動回來時,Cell 的 Checkmark狀態消失了。

如圖,selectCell的狀態可以即時更改,選中 或 取消選中,但是這只是改變了介面,並沒有改變資料來源。

當頁面滑動時,我們標記為Checkmark的Cell會被複用,從而丟失這個狀態。

所以我採用了NSMutableSet用來儲存Cell的 indexPath,從而便於之後 cellForRowAtIndexPath 方法中按照NSMutableSet中的內容,來將之前選擇過的 Cell 標記 Checkmark(打勾)

需要注意的是,一開始我採用了Array(不是NSArray)來儲存indexPath,用Array的removeAtIndex和append來移除、加入資料,

但是莫名其妙地產生了一些不好的影響:

        因為你總是需要遍歷陣列來在 cellForRowAtIndexPath 方法中,檢視哪些cell是應該被選中過的,然後改成Checkmark狀態;

        結果就可能會產生陣列越界、App崩潰,以及錯誤的indexPath被append進陣列的情況。

而NSMutableSet的功能更適合這種情況:它有addObject、removeObject、containsObject三個方法。

在 cellForRow 方法中,不需要for迴圈可以三行程式碼給cell加Checkmark標記。


相關文章