2016-09-30 68 views
0

我正在嘗試使用UITableview多選,並選中行的複選標記附件視圖。如果我打開和關閉tableView:didSelectRow中的附件視圖,這主要工作。我必須保留自己的UITableView「isSelected」數組嗎?

但是,我試圖構建一個selectAll方法,並且我發現所選單元格的數組在我旋轉了所有單元格之後被清除,並選擇它們,然後再調用reloadData()

我懷疑重新加載表會清除選擇。我不知道有任何其他方式可以在設置選定的標記和附件視圖之後繪製所有單元格。

我想知道是否需要保留自己的選定行數組。有沒有其他人建立這樣的事情?它似乎是一種常見的情況。

任何提示或示例代碼讚賞。

回答

0

取一個數組,並將每個選定單元格的indexPath加入其中,並在cellForRowAt...中加入條件,如果數組包含該特定的indexPath,則將其設置爲選中狀態。

+0

我想我理解了這麼多。還提到語言(ObjC或Swift)。 –

0

您需要的cellForRowAtIndexPath方法添加一些功能,像這樣的ANG這樣

讓你的視圖控制器代碼我們採取的照片庫應用的一個例子

class CreateEvent: UIViewController,UITableViewDataSource,UITableViewDelegate { 

var yourArray : [Photo] = [Photo]() 
//MARK: - Content TableView Methods 
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 

    let cell = tableView.dequeueReusableCellWithIdentifier("CustomCell", forIndexPath: indexPath) 
    let objPhoto = yourArray[indexPath.row] 
    if objPhoto.isPhotoSelected == true 
    { 
     cell.accessoryType = .Checkmark 
    } 

    return cell 

} 

func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) 
{ 
    let objPhoto = yourArray[indexPath.row] 
    objPhoto.isPhotoSelected = true 
    let cell = tableView.cellForRowAtIndexPath(indexPath) 
    cell.accessoryType = .Checkmark 

} 
//MARK: Action Method 

func selectAllPhoto() 
{ 
    for objPhoto in yourArray 
    { 
     objPhoto.isPhotoSelected = true 
    } 

    tableView.reloadData() 
} 
} 

還有一件事,你需要創建像

class Photo: NSObject { 

var photoName:String = "" 
var isPhotoSelected = false 

} 

希望自定義對象,這將幫助你

0

您可以採取兩種方法。一種是跟蹤選定的行號。爲此,您可以使用NSMutableIndexSet或其Swift對應文件IndexSet

本質上,選擇一行時,將其添加到集合中。當您取消選擇時,將其從集合中刪除。在cellForRowAtIndexPath中,您可以使用containsIndex來確定是否應顯示覆選標記。

由於您在重新加載表格時明確提到了選擇問題,因此值得考慮存儲行號(無論是在一個集合還是一個數組中)的問題,也就是說行數可以更改。

說我已經選擇了行4,7和9,這些值存儲在索引集中。當我重新加載數據時,可能在「舊」行8之後插入了新數據,所以現在我應該選擇第4,7和10行,但是我仍然會選擇4,7和9。

解決方案是爲應該選擇的數據存儲某種唯一標識符。這將取決於您的數據,但假設您有一個對每個項目都是唯一的字符串。您可以在此字符串存儲在一個NSMutableSet或雨燕Set,這又可以很容易地檢查一個給定的項目是使用contains

0

對於多重選擇最好的辦法是

取模型對象選擇,在取所有屬性和一個額外的boolean屬性(如isSelected)來保存選擇。

在選擇行

  1. 的情況下,從所述陣列
  2. 取相關對象然後更新isSelected布爾型(像isSelected = !isSelected)並重新加載表。

在選擇的所有情況下

  1. 只要環路通過陣列的情況下。
  2. 從數組中取出模型對象。
  3. 使isSelected = true
  4. 完成循環後,重新加載表格。

希望這個概念能幫助你建立你的邏輯。

快樂編碼...