【问题标题】:Swift: Multiple Custom TableViewCells from XIB filesSwift:来自 XIB 文件的多个自定义 TableViewCell
【发布时间】:2016-12-30 11:11:50
【问题描述】:

我正在关注tutorial from Jared Davidson 在我的应用程序中使用 XIB 文件实现多个 CustomTableViewCells。我的 Xcode 项目中有这些文件:

我有一个 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
        }
    }

}

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

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

【问题讨论】:

  • 您应该将所有笔尖注册到可重用单元格的表格视图中。使用elementCellTypetableView.dequeueReusableCell(withIdentifier: <#T##String#>, for: <#T##IndexPath#>)。为每个单元格的 nib 文件设置自动布局,因此您无需为单元格编写任何代码。
  • 您的单元格未注册,numberofsection 应返回 1 并检查您的表格视图委托和数据源是否已连接。

标签: ios swift tableview xib tableviewcell


【解决方案1】:

在viewdidload中注册xib文件如下:

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

然后在 cellForRowIndex 路径中:使用它们的标识符访问单元格

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

【讨论】:

  • 非常感谢。这按预期工作。我稍后会更新我的问题,以便在我的代码中向其他人展示解决方案......
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-15
  • 1970-01-01
相关资源
最近更新 更多