簡體   English   中英

在單個uitableviewcell中添加子視圖

[英]adding subview in a single uitableviewcell

我面臨將UIImageView添加到單個UITableViewCell的問題。 我將這樣的子視圖添加到cellForIndexPath委托方法中,如果self.mediaTypeArray在索引:indexPath.row處包含字符串:“ Image”,則僅將其添加到單元格中

let cell = self.timelineTableView.dequeueReusableCellWithIdentifier( NSStringFromClass(ClassicCaseCell), forIndexPath: indexPath) as? ClassicCaseCell

if self.mediaTypeArray[indexPath.row] == "Image" {

    let imageView = UIImageView()
    imageView.frame.size = (cell?.evidenceView.frame.size)!
    imageView.frame.origin = CGPointZero
    imageView.image = img

    cell?.evidenceView.addSubview(imageView)
}

然而,這很好用,我發現即使self.mediaTypeArray [indexPath.row]不等於“ Image”,其他兩個單元格都包含相同的imageView,我也不明白為什么。 我認為這可能與可重用的tableviewcell有關,但我仍然不明白為什么會這樣做。 請幫忙!

我感覺這是因為細胞被重復使用。

解決此問題的一種方法是重寫ClassicCaseCellprepareForReuse方法,以從其evidenceView視圖中刪除任何圖像視圖。

但是,我建議您不要以這種方式(通過委托的cellForIndexPath方法)添加圖像視圖。 相反,您的ClassicCaseCell應該將圖像視圖作為實例變量保存,然后可以在cellForIndexPath進行設置。 這樣,最多只有一個。 您還可以確保在prepareForReuse中將圖像視圖設置為nil,並確保如果未設置圖像視圖將不會出現在單元格中。

首先,不要使用其他地方建議的tag屬性。 那是很久以前使用的技術,但是蘋果現在不鼓勵這樣做。 其次,建議您簡化生活,不要在cellForRowAtIndexPath編程方式添加圖像視圖。 如果以編程方式添加圖像視圖,則單元重用會引入笨拙的過程來確定(a)是否需要圖像視圖; (b)是否有現有的影像視圖; (c)可能添加/刪除圖像視圖和/或獲取對現有視圖的引用。

一個非常簡單的解決方案是只具有兩個單元原型,一個具有圖像視圖,另一個不具有圖像視圖。 然后,根據媒體類型,使用適當的情節提要板標識符使單元出隊並使用它。

另一種選擇是不考慮單元中的圖像視圖,並適當地隱藏/顯示它。 接下來的挑戰是如何最好地管理兩組約束,一組約束用於圖像視圖可見時,另一組約束在圖像視圖不可見時。 您可以通過明智地選擇約束優先級,激活/停用cellForRowAtIndexPath等中的適當約束來執行此操作。可以做到這一點,但這比上述方法麻煩,因為您僅使用兩個像元原型。

您只需要添加一次UIImageView,因此,如果再次使用該單元,則它可能已經存在。 您的問題是檢測是否已添加它。 這里有一些建議:

1)始終創建它(只是不設置圖像或隱藏它)

2)為它分配一個唯一的標簽,並在需要設置它時查找該標簽...沒有標簽,然后創建它

覆蓋tableview單元中的prepareForReuse委托,並從那里刪除imageview

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM