2017-07-25 42 views
-1

所以我有一個tableview,它有每個單元格中的項目列表。這些單元格中的每一個都包含一個圖像視圖,該圖像在被點擊時展開該單元格並顯示該項目的圖像。當我向下滾動表格視圖並向上滾動到選定的單元格時,圖像就消失了。我知道這是由於重複使用單元格,但我不確定如何在滾動其他項目時將展開的單元格圖像保留在原位。防止選中的單元格被重用

我來最接近的是在這裏: my table view reuse the selected cells when scroll -- in SWIFT

如果有人能伸出援助之手,這將是真棒。謝謝!

編輯:添加代碼片段 - 抱歉等待。

fileprivate var expandedRowIndex: Int? 

// cellForRowAt 
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell 
{ 
    // CatalogItem row. 
    let item = self.items[indexPath.row] 
    let expanded = indexPath.row == self.expandedItemRowIndex 

    // Return standard catalog item cell. 
    let reuseID = expanded 
       ? CatalogItemCell.PROTOCELL_EXPANDED.id 
       : CatalogItemCell.PROTOCELL.id 
    let cell = tableView.dequeueReusableCell(withIdentifier: reuseID) as! CatalogItemCell 

    // Reset thumbnail image back to nil. Needed so that images appear 
    // only in the cell that they belong in. 
    if indexPath.row == self.expandedRowIndex{ 
     cell.uiImage_Thumbnail.image = nil 
    }  
    return cell 
} 

// didSelectRowAt 
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) 
{ 
    tableView.deselectRow(at: indexPath as IndexPath, animated: true) 

    // Expand row - Get the current cell and show image 
    self.expandedItemRowIndex = indexPath.row 
    let item = self.items[indexPath.row] 
    let currentCell = tableView.cellForRow(at: indexPath) 

    // Pass both the selected cell and item to the ImageManager 
    ImageManager.startImageRequest(currentCell: currentCell!, item: item) 

    if self.expandedRowIndex == indexPath.row 
    { 
     // Selected row is already expanded. 
     return 
    } 

    var reloadPaths = [IndexPath]() 

    // Collapse previously expanded row. 
    if let previousRowIndex = self.expandedRowIndex 
    { 
     reloadPaths.append(IndexPath(row: previousRowIndex, section: 0)) 
    } 

    // Expand the selected row. 
    self.expandedRowIndex = indexPath.row 
    let item = self.items[indexPath.row] 
    debugPrint(item.description) 
    reloadPaths.append(IndexPath(row: indexPath.row, section: 0)) 
    tableView.reloadRows(at: reloadPaths as [IndexPath], with: .fade) 

} 
+0

你可以爲你的cellForRowAtIndexPath方法添加代碼嗎? – Delimiter

+1

「阻止選定的單元格被重用」:否,您希望保留重用以及所有優化。希望你需要了解重用的工作方式,並使你的代碼適應它。隨着一些代碼和例子,我們可能會幫助你,但其他,我們不能。 – Larme

+0

用幾個片段更新了我的問題。希望這足以讓我走上正軌。 @Larme是的,我想我是因爲缺乏iOS世界的知識而寫錯了這個問題。我想保持單元格展開並保持圖像顯示,儘管滾動遠離該單元格。 – Mystified

回答

3

您可以維護一個selectedIndex變量。 在你的cellForRow你檢查這個調用是否爲selectedCell。如果是,則執行所選單元格所需的自定義。

此外,你可能想要處理heightForRow,還檢查呼叫是否爲選定的單元格。

您可以維護所選單元格的indexPath。如果有多個部分。 不需要防止重複使用它。

希望有所幫助。

+0

在我正在使用的代碼中存在一個像這樣的變量。但是,我終於注意到它並沒有被設置在任何地方。一旦我確定了,一切都奏效了...... Doh! 謝謝! – Mystified

相關問題