0

私は自分のView Controllerから値を渡そうとしているカスタム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を添付することです。そのイメージは、ストーリーボード(NIB)の読み込み処理中にすでにUIImageViewがコンテナとして配置されていて、その内部の画像プロパティを後で設定するだけなので機能します。

の将来値のセルレンダリングおよびイベント処理中に、すべてsomeValueの値を正しく設定しておく必要があります。たとえば、セルが表示され、タップされた後に実行される@IBActionハンドラがある場合、実際にはsomeValueにアクセスします。そこにテストプリントが必要です。あなたは最終的にはを使用していますか?someValue

フォロー

だから、簡単なエラーです。テキスト値をcellForRowAtIndexPathに設定するだけです。セルにモデルデータのコピーは必要ありません(つまり、セルにsomeValueフィールドを持つ必要はありません)。ちょうどあなたの(適切に分離された)モデルデータから動的UIを設定します。

の代わり:

cell.someValue = 5 

をあなただけ例えば、必要があります。

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

それは、のいずれかのinitを使用することを誤解ですこの。テーブルセルに対するinitの唯一の責任は、メモリを割り当てることです。セルは完全に動的で一時的なオブジェクトであり、アプリケーションデータを反映するすべてのプロパティはcellForRowAtIndexPathメソッドで設定する必要があります。セルの視覚的レンダリングは、cellForRowAtIndexPathメソッドが完了するのを待つため、タイミングに問題はありません。

+0

実際のバージョンでは、私はいくつかを作ることができるように 'indexPath.item'の値を渡そうとしています表示中の内容に基づいて、init中にセルの外観がわずかに変化します。 – Nitroid

+0

'init'の間に変更を行うのは誤解です。テーブルセルに対する' init'の唯一の責任は、メモリを割り当てることです。セルは完全に動的で一時的なオブジェクトであり、アプリケーションデータを反映するすべてのプロパティは 'cellForRowAtIndexPath'メソッドで設定する必要があります。セルの視覚的レンダリングは、 'cellForRowAtIndexPath'メソッドが終了するのを待つので、タイミングの問題はありません。 – BaseZen

0

セルが初期化された後にsomeValueの値を設定しています。

初期化処理中にprint("Passed value is: \(someValue)")に電話しています。

セルクラスのinitメソッドでブレークポイントを設定します。変数5に値5を代入する前に、変数がそこを通過するのがわかります。

1

Initメソッドは、UICollectionViewがインスタンス化されるときに呼び出されます。あなたはinitメソッドで "someValue"を記録していますが、それは早すぎます。すでにインスタンス化されているImageViewを直接操作しているので、画像がレンダリングされます。 imageView.imageをinitメソッドに記録しようとすると、それもnilでなければなりません(または、セルが再利用されるためにnilでないかもしれません)。

カスタム変数のセッターとゲッターで、自分の仕事がゼロではないと確信している必要があります。

var someValue: Int!{ 
    didSet { 
     print("Passed value is: \(newValue)") 
    } 
} 
関連する問題