0

我有一個自定義的UICollectionViewCell,我試圖從我的視圖控制器傳遞一個值。我能夠將圖像傳遞給單元格,但初始化後其他任何內容都會出現。如何將值傳遞給自定義UICollectionViewCell?

相關的代碼在視圖控制器:

override func viewDidLoad() { 

    self.collectionView!.registerClass(MyCustomCell.self, forCellWithReuseIdentifier: "Cell") 

} 

func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell { 

    let cell = collectionView.dequeueReusableCellWithReuseIdentifier("Cell", forIndexPath: indexPath) as! MyCustomCell 

    cell.someValue = 5 
    cell.imageView.image = UIImage(named: "placeholder.png") 

    return cell 

} 

在自定義單元格類:

var someValue: Int! 
var imageView: UIImageView! 

override init(frame: CGRect) { 

    super.init(frame: frame) 

    imageView = UIImageView(frame: CGRectMake(0, 0, frame.width, frame.height)) 
    contentView.addSubview(imageView) 

    let someValueLabel = UILabel() 
    someValueLabel.frame = CGRectMake(0, 75, 200, 30) 
    someValueLabel.text = "Value is: \(someValue)" 
    self.addSubview(someValueLabel) 
} 

的圖像被成功地從UICollectionView過去了,我能夠顯示,但是「someValue中'總是零。

我在做什麼錯?

+0

此外,你不應該調用你的UIImageView屬性「imageView」。由於UITableViewCell已經包含一個使用這個名字的人。這可能會導致不必要的影響。也許它已經修復了,但我已經遇到了一些麻煩。像這樣Q:http://stackoverflow.com/questions/11681273/uitableviewcell-imageview-changing-on-select – BoilingLime

回答

2

init方法被調用的時間比您認爲的要早得多 - 在dequeue進程中 - 構建單元對象時。初始化過程的一部分是附加故事板中設計的UIViews。因此,該圖像的工作原理是因爲UIImageView在Storyboard(NIB)加載過程中作爲容器已經就位,而您稍後將設置其內部圖像屬性。

在單元格渲染和事件處理期間,您已經正確設置了所有未來的使用值someValue。因此,例如,如果在單元格顯示並點擊之後運行@IBAction處理程序,它確實可以訪問someValue。這就是你的測試印刷應該去的地方。你最終用什麼使用someValue

隨訪

所以這是一個簡單的錯誤;你只需要在cellForRowAtIndexPath中設置文本值。您不需要單元格中的模型數據副本(即您的單元中不需要有someValue字段)。的

代替:

cell.someValue = 5 

你只需要,如:

cell.someValueLabel.text = "\(indexPath.row)" // or where ever you're getting your underlying model data from 

它使用init任何的誤解,只是從你的(正確分離)模型數據動態配置UI這個。 init表格單元格的唯一責任是分配內存。單元是一個完全動態的臨時對象,它的所有反映應用程序數據的屬性必須在cellForRowAtIndexPath方法中設置。單元格的可視化渲染等待cellForRowAtIndexPath方法完成,因此沒有計時問題。

+0

在真正的版本中,我試圖傳遞'indexPath.item'值,以便我可以做一些根據所顯示的任何內容,在初始化期間對單元格外觀進行輕微更改。 – Nitroid

+0

在'init'中進行更改是一種誤解。init表格的唯一責任是分配內存。單元是一個完全動態的臨時對象,它的所有反映應用程序數據的屬性必須在'cellForRowAtIndexPath'方法中設置。單元格的可視化渲染等待'cellForRowAtIndexPath'方法完成,所以沒有計時問題。 – BaseZen

0

您正在設置單元格初始化後someValue的值。

在初始化過程中您正在調用print("Passed value is: \(someValue)")

在你的單元類的init方法中設置一個斷點。在將值5分配給該變量之前,您應該看到它通過那裏。

1

當UICollectionView被實例化時調用Init方法。你在init方法中記錄「someValue」,現在還爲時過早。由於您正在對已經實例化的ImageView直接進行操作,所以呈現圖像。嘗試在init方法中記錄imageView.image,它應該也是零(或可能不是零,因爲單元格被重用)。

你應該在自定義變量設置器和獲取器中完成你的工作,你確定它們不是零。

var someValue: Int!{ 
    didSet { 
     print("Passed value is: \(newValue)") 
    } 
} 
相關問題