2016-12-30 8 views
0

私のアプリでXIBファイルを使用して複数のCustomTableViewCellを実装するには、このtutorial from Jared Davidsonに従います。私のXcodeプロジェクトには、Image Link Xcode Filesというファイルがあります。Swift:XIBファイルからの複数のカスタムTableViewCell

私はTextElementのを持っている:Image Linkと 私が持っているImageElement:Image Link

私はこの後Firebaseを実装するために、オフラインデータでこれをテストしたいが働いています。これは私のHome.swiftデータ構造体である:

import Foundation 
import FirebaseDatabase 

struct Home { 

var key:String! 
let itemRef:FIRDatabaseReference? 
var userUID:String! 
var user:String! 

// Home Element Cell Content 
var elementSortNumber:Int! 
var elementCellType:String! 
var referenceElementID:String! 

var databaseVersion:String! 

init (key:String = "", 
     uid:String, 
     user:String, 

     elementSortNumber:Int, 
     elementCellType:String, 
     referenceElementID:String, 
     databaseVersion:String) { 

    // General (Security tracking) 
    self.key = key 
    self.itemRef = nil 
    self.userUID = uid 
    self.user = user 

    // Home Element Cell Content 
    self.elementSortNumber = elementSortNumber 
    self.elementCellType = elementCellType 
    self.referenceElementID = referenceElementID 

} 

init (snapshot:FIRDataSnapshot) { 

    // General (Security tracking) 
    key = snapshot.key 

    itemRef = snapshot.ref 

    if let addedByUser = snapshot.value as? NSDictionary, let _temp = addedByUser["User"] as? String { 
     user = _temp 
    } else { 
     user = "" 
    } 

    // Home Element Cell Content 
    if let homeElementSortNumber = snapshot.value as? NSDictionary, let _temp = homeElementSortNumber["Title"] as? Int { 
     elementSortNumber = _temp 
    } else { 
     elementSortNumber = 50 
    } 

    if let homeElementCellType = snapshot.value as? NSDictionary, let _temp = homeElementCellType["Content"] as? String { 
     elementCellType = _temp 
    } else { 
     elementCellType = "" 
    } 

    if let homeElementID = snapshot.value as? NSDictionary, let _temp = homeElementID["Ref Element ID"] as? String { 
     referenceElementID = _temp 
    } else { 
     referenceElementID = "" 
    } 

    if let textDatabaseVersion = snapshot.value as? NSDictionary, let _temp = textDatabaseVersion["DB Version"] as? String { 
     databaseVersion = _temp 
    } else { 
     databaseVersion = "" 
    } 

} 

}

これは私のTableViewControllerのコードです:

import UIKit 

class HomeTableViewController: UITableViewController { 

    var arrayOfCellData = [Home]() 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     // Do any additional setup after loading the view. 

     arrayOfCellData = 
      [Home(key: "", 
        uid:"", 
        user:"", 

        elementSortNumber:1, 
        elementCellType:"TextElement", 
        referenceElementID:"123ABC", 
        databaseVersion:"1"), 

      Home(key: "", 
        uid:"", 
        user:"", 

        elementSortNumber:1, 
        elementCellType:"ImageElement", 
        referenceElementID:"QWERTZ", 
        databaseVersion:"1"), 

      Home(key: "", 
        uid:"", 
        user:"", 

        elementSortNumber:1, 
        elementCellType:"TextElement", 
        referenceElementID:"XYZ789", 
        databaseVersion:"1")] 

    } 

    override func didReceiveMemoryWarning() { 
     super.didReceiveMemoryWarning() 
     // Dispose of any resources that can be recreated. 
    } 

    // MARK: - Table view data source 

    override func numberOfSections(in tableView: UITableView) -> Int { 
     // If I return 1 the app crashes and if I comment this function it also crashes. 
     return 0 
    } 

    override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
     return arrayOfCellData.count 
    } 

    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 

     if arrayOfCellData[indexPath.row].elementCellType == "TextElement" { 

      let textElementCell = Bundle.main.loadNibNamed("TextElementTableViewCell", owner: self, options: nil) as! TextElementTableViewCell 

      textElementCell.textElementTitleLabel.text = arrayOfCellData[indexPath.row].referenceElementID 

      return textElementCell 

     } 

     else if arrayOfCellData[indexPath.row].elementCellType == "ImageElement" { 

      let imageElementCell = Bundle.main.loadNibNamed("ImageElementTableViewCell", owner: self, options: nil) as! ImageElementTableViewCell 

      imageElementCell.imageElementImageView.image = UIImage(named: "placeholder") 

      return imageElementCell 
     } 

     else { 

      let textElementDefaultCell = Bundle.main.loadNibNamed("TextElementTableViewCell", owner: self, options: nil) as! TextElementTableViewCell 

      textElementDefaultCell.textElementTitleLabel.text = arrayOfCellData[indexPath.row].referenceElementID 

      return textElementDefaultCell 
     } 

    } 

    override func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat { 

     if arrayOfCellData[indexPath.row].elementCellType == "TextElement" { 
      return 116 
     } 
     else if arrayOfCellData[indexPath.row].elementCellType == "ImageElement" { 
      return 275 
     } 
     else { 
      return 116 
     } 
    } 

} 

これは問題です:あなたが見ることができるようシミュレータは空ですこの画像Image Linkなぜですか?どうすれば修正できますか?

私は本当にいくつかの助けに感謝します。ありがとうございました。

+0

'numberOfSections'は1以上でなければならない、とあなたはクラッシュを得ましたあなたの 'cellForRowAt'がかなり間違って見えるので、あなたがチュートリアルからそれを取ったかどうかは分かりません。 – Tj3n

+0

再利用可能なセルのテーブルビューにすべてのnibを登録する必要があります。 'elementCellType'を' tableView.dequeueReusableCell(withIdentifier:<#T##String#>、for:<#T ## IndexPath#>) 'に使用してください。各セルのnibファイルの自動レイアウトを設定するので、セルのコードを書く必要はありません。 – bubuxu

+0

セルが登録されておらず、** numberofsection **が1を返します。また、テーブルビューのデリゲートとデータソースが接続されているかどうかを確認してください。 –

答えて

3

などのviewDidLoadで下のXIBファイルを登録します。

tableView.register(UINib(nibName: "TextElementTableViewCell", bundle: Bundle.main), forCellReuseIdentifier: "TextElementTableViewCellIdentifier") 

その後cellForRowIndexパスで:アクセスセル自分の識別子を使用して

let cell : UITableViewCell = tableView.dequeueReusableCell(withIdentifier: "TextElementTableViewCellIdentifier", for: indexPath) as! TextElementTableViewCell 
+0

ありがとうございました。これは期待通りに機能しました。私は後で他の人のために自分のコードに解決策を示すために私の質問を更新します... –

関連する問題