将UIView添加到tableFooterView时,UITableView会抛出异常

时间:2016-03-11 20:42:23

标签: ios iphone swift uitableview uiview

我正在尝试实现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
}

}

1 个答案:

答案 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且您的应用程序崩溃。我的解决方案通过为您的数组提供初始值来解决此问题。