如圖,是一個可以多項選擇的 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标記。