如何解决自定义表视图插座抛出零
我正在尝试使用遵循此 tutorial 的 VIPER 模式实现一个简单的 iOS 应用程序。该应用程序是一个简单的表格视图,它显示来自 json req 的数据
我已经创建了表格视图,并且可以使用默认的 cell.textLabel
成功显示来自我的对象的数据。然而,我正在尝试创建一个自定义表格视图单元格,因此创建了笔尖和类。我已将所有插座从笔尖正确连接到该类,该类的代码如下:
class CustomTableViewCell: UITableViewCell {
static let identifier = "CustomTableView"
static func nib() -> UINib {
return UINib(nibName: "CustomTableViewCell",bundle: nil)
}
@IBOutlet var level: UILabel!
@IBOutlet var levelNumber: UILabel!
@IBOutlet var progress: UIProgressView!
@IBOutlet var leftProgress: UILabel!
@IBOutlet var rightProgress: UILabel!
public func configure(levelString: String,levelNum: String,prog: Float,left: String,right: String) {
level.text = levelString
levelNumber.text = levelNum
progress.setProgress(prog,animated: true)
leftProgress.text = left
rightProgress.text = right
}
override func awakeFromNib() {
super.awakeFromNib()
}
}
问题是,当我运行应用程序时,这些插座出错:配置函数内的 Fatal error: Unexpectedly found nil while implicitly unwrapping an Optional value
上的 level.text
。在我看来,我可以通过这样做来抑制这个错误:
table.register(CustomTableViewCell.nib(),forCellReuseIdentifier: CustomTableViewCell.identifier)
但是这只是显示一个没有自定义行或任何数据的空 tableView。如果我执行 table.register(CustomTableViewCell.self,forCellReuseIdentifier: CustomTableViewCell.identifier)
那么这会崩溃。我应该怎么做,如何让数据显示在 tableView 中?相关代码添加如下:
let tableView: UITableView = {
let table = UITableView()
table.register(CustomTableViewCell.nib(),forCellReuseIdentifier: CustomTableViewCell.identifier)
table.isHidden = true
return table
}()
override func viewDidLoad() {
super.viewDidLoad()
view.addSubview(tableView)
tableView.delegate = self
tableView.dataSource = self
}
override func viewDidLayoutSubviews() {
super.viewDidLayoutSubviews()
tableView.frame = view.bounds
label.frame = CGRect(x: 0,y: 0,width: 200,height: 50)
label.center = view.center
}
func tableView(_ tableView: UITableView,numberOfRowsInSection section: Int) -> Int {
return achievements.count
}
func tableView(_ tableView: UITableView,cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: CustomTableViewCell.identifier,for: indexPath) as! CustomTableViewCell
cell.configure(levelString: "Level",levelNum: achievements[indexPath.row].level,prog: Float(achievements[indexPath.row].progress/achievements[indexPath.row].total),left: String(achievements[indexPath.row].progress),right: String(achievements[indexPath.row].total))
return cell
}
出口设置:
文件所有者:
解决方法
我很欣赏这可能不是每个人的正确答案,但这对我有用。我一直在努力调试这个,为了时间的缘故,我得出的结论是,以编程方式创建所有东西会更容易。这方面有很多教程,但我采用了以下结构: Stevia 库用于为组件设置约束并添加子视图
import Stevia
import UIKit
class CustomTableViewCell: UITableViewCell {
static let identifier = "CustomTableViewCell"
override init(style: UITableViewCell.CellStyle,reuseIdentifier: String?) {
super.init(style: style,reuseIdentifier: reuseIdentifier)
setupFieldsAndConstraints()
}
func setupFieldsAndConstraints() {
subviews {
customLabel
}
setupCustomLabel()
}
var customLabel: UILabel = {
let level = UILabel()
return level
}()
func setupCustomLabel() {
customLabel.style { l in
l.textAlignment = .left
l.textColor = .white
l.Top == 50
l.Left == 20
}
}
func setValues(object: Object) {
label.text = object.name
}
required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
}
这在您的视图中会像往常一样被引用。我选择将我的添加到封装任何表配置的函数中,然后在 viewDidLoad
中调用:
tableView.register(CustomTableViewCell.self,forCellReuseIdentifier: CustomTableViewCell.identifier)
然后是 cellForRowAt
:
func tableView(_ tableView: UITableView,cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: CustomTableViewCell.identifier) as! CustomTableViewCell
cell.setValues(object: Object[indexPath.row])
return cell
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。