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
这就是问题所在:正如您在这张图片中看到的那样,模拟器是空的 为什么?我该如何解决?
非常感谢您的帮助。谢谢。
【问题讨论】:
您应该将所有笔尖注册到可重用单元格的表格视图中。使用elementCellType
到tableView.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 单元格