我正在创建一个简单的表但没有故事板,只是编码,目前我可以创建表但是当我添加它崩溃时,这些是我的变量:
var optionsTableView:UITableView!
var options = ["Option1", "Option2"]
当我点击一个按钮时,表格显示,该功能为:
@IBAction func Options(sender: AnyObject) {
if optionsTableView != nil {
optionsTableView.removeFromSuperview()
self.optionsTableView = nil
return
}
self.optionsTableView = UITableView()
self.optionsTableView.backgroundColor = UIColor(white: 0, alpha: 0.95)
self.optionsTableView.delegate = self
self.optionsTableView.dataSource = self
self.optionsTableView.translatesAutoresizingMaskIntoConstraints = false
var constraints = [NSLayoutConstraint]()
constraints.append(NSLayoutConstraint(item: optionsTableView, attribute: .Leading, relatedBy: .Equal, toItem: self.view, attribute: .Leading, multiplier: 1.0, constant: 100.0))
constraints.append(NSLayoutConstraint(item: optionsTableView, attribute: .Trailing, relatedBy: .Equal, toItem: sender, attribute: .Trailing, multiplier: 1.0, constant: 0))
constraints.append(NSLayoutConstraint(item: optionsTableView, attribute: .Top, relatedBy: .Equal, toItem: sender, attribute: .Bottom, multiplier: 1.0, constant: 5.0))
self.view.addSubview(optionsTableView)
self.view.addConstraints(constraints)
optionsTableView.addConstraints([NSLayoutConstraint(item: optionsTableView, attribute: .Height, relatedBy: .Equal, toItem: nil, attribute: .Height, multiplier: 1.0, constant: 220.0)])
}
表的功能:
func numberOfSectionsInTableView(tableView: UITableView) -> Int {
return 1
}
func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return self.options.count
}
func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {
return 44.0
}
到目前为止一切顺利但是使用了cellForRowAtIndexPath,应用程序崩溃了:
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
var cell = optionsTableView.dequeueReusableCellWithIdentifier("cell")!
if tableView == optionsTableView {
cell = UITableViewCell(style: .Default, reuseIdentifier: "cell")
cell.backgroundView = nil
cell.backgroundColor = UIColor.clearColor()
cell.textLabel?.textColor = UIColor.whiteColor()
cell.textLabel?.text = self.options[indexPath.row]
return cell
}
return cell
}
特别是在这一行中,应用程序崩溃:
var cell = optionsTableView.dequeueReusableCellWithIdentifier("cell")!
并且控制台说:“致命错误:在展开”可选“值时意外发现nil”,您认为发生了什么?
答案 0 :(得分:5)
该行崩溃是因为它没有找到具有该重用标识符的单元格。
您必须注册:
SetResult()
当你强行打开它时,它不会崩溃。
答案 1 :(得分:1)
我的代码有点改变了。固定约束。
import UIKit
class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {
var optionsTableView = UITableView()
var options = ["Option1", "Option2"]
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
optionsTableView = UITableView(frame: UIScreen.mainScreen().bounds)
//optionsTableView.backgroundColor = UIColor(white: 0, alpha: 0.95)
optionsTableView.delegate = self
optionsTableView.dataSource = self
optionsTableView.translatesAutoresizingMaskIntoConstraints = false
view.addSubview(optionsTableView)
optionsTableView.registerClass(UITableViewCell.classForCoder(), forCellReuseIdentifier: "cell")
}
override func viewWillLayoutSubviews() {
var constraints = [NSLayoutConstraint]()
constraints.append(NSLayoutConstraint(item: optionsTableView, attribute: .Top, relatedBy: .Equal, toItem: topLayoutGuide, attribute: .Bottom, multiplier: 1.0, constant: 0))
constraints.append(NSLayoutConstraint(item: optionsTableView, attribute: .Bottom, relatedBy: .Equal, toItem: bottomLayoutGuide, attribute: .Top, multiplier: 1.0, constant: 0))
constraints.append(NSLayoutConstraint(item: view, attribute: .Trailing, relatedBy: .Equal, toItem: optionsTableView, attribute: .Trailing, multiplier: 1.0, constant: 0))
constraints.append(NSLayoutConstraint(item: optionsTableView, attribute: .Leading, relatedBy: .Equal, toItem: view, attribute: .Leading, multiplier: 1.0, constant: 0))
view.addConstraints(constraints)
}
func numberOfSectionsInTableView(tableView: UITableView) -> Int {
return 1
}
func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return self.options.count
}
func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {
return 44.0
}
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let cell = optionsTableView.dequeueReusableCellWithIdentifier("cell")!
cell.textLabel?.text = options[indexPath.row]
return cell
}
}