Swift:来自 XIB 文件的多个自定义 TableViewCells

Swift: Multiple Custom TableViewCells from XIB files

我正在关注这个 tutorial from Jared Davidson to implement multiple CustomTableViewCells with XIB files in my app. I have these files in my Xcode project:

我有一个 TextElement: 和 我有一个 ImageElement:

我想用离线数据测试它,以便在它工作后实施 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
        }
    }

}

这就是问题所在:模拟器是空的,正如您在这张图片中看到的那样 为什么?我该如何解决?

非常感谢您的帮助。谢谢。

在viewdidload中如下注册xib文件:

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

然后在 cellForRowIndex path:Access 单元格中使用它们的标识符

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