我正在尝试实现UITableView。我已经能够使它工作了,但它一直在显示空单元格中的线条,所以我在网上找到了一个解决方案,将UIView放在tableFooterView中,所以我做到了:
self.tableView.tableFooterView = IUView()
在第一个表视图中,我设置它工作正常,但知道我试图实现第二个,它不起作用。如果我在没有上面一行的情况下运行它,一切正常,但是我在空单元格中得到了行。如果我使用上面的行运行,我得到一个'致命错误:在解开一个Optional值时意外发现nil',并且XCode将错误指向此行:
func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return self.itemsList.count // Throws error: Thread 1: EXC_BAD_INSTRUCTION (code=EXC_I386_INVOP, subcode=0x0)
}
有谁知道为什么会这样?或者我该如何解决?或者,如果有更好,更直接的方式隐藏在空单元格上的线条?谢谢!
这里是我的UIViewController类供参考:
class InfoPickerViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {
@IBOutlet weak var infoPicker: UITableView!
private var pageTitle: String!
private var itemsList: [String]!
convenience init(title: String){
self.init()
self.pageTitle = title
}
override func viewDidLoad() {
super.viewDidLoad()
self.navigationController?.navigationBar.tintColor = UIColor.whiteColor()
self.title = self.pageTitle
self.infoPicker.delegate = self
self.infoPicker.dataSource = self
self.infoPicker.tableFooterView = UIView()
self.infoPicker.registerNib(UINib(nibName:"SimpleTableViewCell", bundle: nil), forCellReuseIdentifier: "simpleCell")
populateItemsList()
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
func populateItemsList() {
let clientsInfo = ClientsInfo()
self.itemsList = []
switch self.pageTitle {
case "Cliente": self.itemsList = clientsInfo.getClientsList()
default: self.itemsList = []
}
}
// MARK: TableView
func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return self.itemsList.count
}
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let listItemCell = infoPicker.dequeueReusableCellWithIdentifier("simpleCell", forIndexPath: indexPath) as! SimpleTableViewCel
listItemCell.itemLabel.text = self.itemsList[indexPath.row]
return listItemCell
}
}
答案 0 :(得分:1)
我没有麦克风,但是我会给它一个机会。在ViewController
的顶部,更新以下行:
private var itemsList: [String] = [] {
didSet {
dispatch_async(dispatch_get_main_queue(), {
self.tableView.reloadData()
})
}
}
我们正在初始化您的itemsList
数组,该数组的元素数量为0
,这样numberOfRowsInSection
因为您的itemsList
而崩溃了是nil
。然后,当您的populateItemsList
函数给出itemsList
一个实数值时,您的表视图将重新加载主线程上的数据。
来自评论:
我在答案中描述了错误的来源。您已经获得未初始化的itemsList: [String]!
,当您的numberOfRowsInSection
尝试访问该值时,该值为nil且您的应用程序崩溃。我的解决方案通过为您的数组提供初始值来解决此问题。