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

Posted

技术标签:

【中文标题】Swift:来自 XIB 文件的多个自定义 TableViewCell【英文标题】:Swift: Multiple Custom TableViewCells from XIB files 【发布时间】: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 并检查您的表格视图委托和数据源是否已连接。 【参考方案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

【讨论】:

非常感谢。这按预期工作。我稍后会更新我的问题,以便在我的代码中向其他人展示解决方案......

以上是关于Swift:来自 XIB 文件的多个自定义 TableViewCell的主要内容,如果未能解决你的问题,请参考以下文章

Swift - 带有 xib 文件的自定义视图,IBOutlet 为 nil

swift学习笔记三.使用xib自定义UITableViewCell

错误:在 swift 中使用 xib 文件注册自定义 tableView 单元格

使用 xib 和 tableView 的多个视图

来自 .xib 文件的自定义 UITableViewCell

使用 Swift 3 Xcode 8 加载时缺少自定义 XIB