8

サブクラスがUICollectionViewCellです。セルは多くのコンポーネントを含むストーリーボードで視覚的に設計され、これらのコンポーネントはストーリーボードを使用してSwiftサブクラスの変数にバインドされます。デコード後にUICollectionViewCellでバインディングを復元する方法

Swiftクラスは、データソースから取得したdatからコンポーネントを取り込むロジックを提供します。例えば

class InfoCollectionViewCell : UICollectionViewCell { 

    @IBOutlet weak var mainPanel : UIView! 
    @IBOutlet weak var panel1 : UIView! 

    @IBOutlet weak var firstName : UILabel! 
    @IBOutlet weak var lastName : UILabel! 
    @IBOutlet weak var address : UILabel! 
    etc ... 

    func setVariousProperties(etc) { 
     firstName.text = ... etc 

データ・ソースは、通常のものん:

let cell = collectionView.dequeueReusableCellWithReuseIdentifier("InfoCell", forIndexPath:indexPath) 
if let c : InfoCollectionViewCell = cell as? InfoCollectionViewCell { 
    c.setVariousProperties(...) 
} 

私はもともと唯一の「実装されていません」アサーションを含むデコード/エンコード方式を実装し、それが明らかになりましたフレームワークが時にはクラスをエンコードしてデコードしていることがありました。コンポーネントを保存せずにダミーのエンコード/デコードメソッドを実装すると、コンポーネントにアクセスしたときにゼロ値で予測可能な問題が発生しました。

UICollectionViewCellサブクラスのすべてのコントロールのエンコードとデコードのどちらかを実装する必要があるか、より良い方法を見つける必要があるようです。

コンポーネントの内容を保存するために実際には必要ない(私は思っていません)と思っています。サブクラスによって再利用されるためです。私は上書きしますコンポーネントの内容はデータソースからの値になります。明らかに、すべてのコントロールはストーリーボードで定義されています。私は、initメソッドのストーリーボードから名前で手動でフェッチすることもできますが、それは同じように面倒なように思えますし、コントロールと変数のグラフィカルなリンクを冗長にします。

良い方法がありますか?

「接続を復元する」とかそういうことはできますか?

EDIT:

はどこか質問を投稿し、恵みを追加する間、問題が起こって停止しました。私は今、私のコンポーネントのエンコードメソッドが呼び出されていないことに気付きました。だから何らかの理由で、フレームワークは自分のオブジェクトを連載してデシリアライズすることを決定していましたが、今はそうではありません。したがって、問題は発生しておらず、私はスタックトレースを提供することができません。

XCodeの一部のアップデートでこの問題が修正されたか、それ以外のものが考えられます。

私は明らかにどこかに潜んでいるいくつかのバグがあることを心配しています。

+0

この問題を持つ他の誰?私はコメントを感謝します。 – rghome

答えて

2

ストーリーボードでレイアウトされて接続されているコントロールのエンコード/デコードを実装する必要はありません。これは実行時に処理され、使用準備が整ったUIコンポーネントで他のすべてが正しく接続されている限り、collectionView.dequeueReusableCellWithReuseIdentifierの後にセルが戻されます。チェックするものがあります:

サブクラスは絵コンテカスタムクラスのセクションで指定され
  1. reuseIdentifierあなたは
  2. すべてIBOutletsが接続されているともに接続を表示すべき期待文字列と一致するように定義されます次のコードはIBOutletのvar行です。

あなたはこれらを確保した後、右、彼らはまだゼロであるかどうかを確認するためのコンポーネントをプリントアウトし、任意のデータソースの問題を解消するためにそこにいくつかの単純なテキストを配置しようとしている。

func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell { 
    let cell = collectionView.dequeueReusableCellWithReuseIdentifier("InfoCell", forIndexPath:indexPath) 
    if let c = cell as? InfoCollectionViewCell{ 
     print(c.address) 
     print(c.firstName) 
     print(c.lastName) 

     c.firstName.text = "firstName Test" 
     c.lastName.text = "lastName Test" 
     c.address.text = "address Test" 
    } 
    return cell 
    } 
} 
+0

OK - ありがとう。私はもう少し調べるつもりです。 – rghome

+0

もちろん、私は今それを再現することはできません。スクロールが実行されたときに100セルのビューではかなり簡単に再現可能でしたが、表示される最初の画面ではなく、セル数が少ないビューでは問題が発生しませんでした。私は何かが細胞の直列化を誘発したと推測します。断続的なバグがあることを私は気にしています。あなたが提案したすべてのものが適用されていなければなりません。さもなければ、私は細胞の最初のスクリーンを持っていないでしょう。私が得たエラーは、init(コーダー)が呼び出されていて、IBOutletがデコード後に配線されていなかったことを明らかに示しました。 – rghome

+0

私はこれが正しい答えであることを望みます。私はそれがあると確信していません。上で述べたように、エンコード/デコードの呼び出しは、原因不明のために発生しなくなりました。いくつかのバージョンのIOS(またはシミュレータ)のバグであったとしても、それがすべてのデバイスで修正されているとは確信できません。最高の戦略は、安全にプレーし、すべてのコンポーネントのデコードとエンコードを実装することです。 – rghome

関連する問題