如何在UITableView中安全地使用未初始化的数组并显示一个空表

时间:2016-09-20 12:17:02

标签: ios arrays uitableview nsuserdefaults

如果数组为空并且您从UITableView或UIPickerView发出请求时如何防止崩溃?

我目前的方法是在将数据与虚拟数据一起使用之前始终初始化我的数组,但我对此方法并不满意,因为有时不需要虚拟数据甚至更糟,有时它不会甚至有意义地显示数据,事实上大多数时候我想要的是如果没有数据就显示一个空表。

例如,如果我要从NSUserDefaults中检索要在UITableView中使用的数组,我通常会在AppDelegate中对其进行初始化,如下所示...

AppDelegate.swift:

    NSUserDefaults.standardUserDefaults().registerDefaults([
        keyMyAarray:["Dummy Data"]// initializing array
     ])

SomeViewController:

var myArray = read content from NSUserDefaults...

func numberOfSectionsInTableView(tableView: UITableView) -> Int {
    return 1
}

fun tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return myArray.count
}

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {        
    var cell = UITableViewCell()
    cell.textLabel.text = myArray[indexPath.row]
    return cell
}

同样,如何在UITableView中安全地使用未初始化的数组并显示空表?

2 个答案:

答案 0 :(得分:3)

无需在数组中放置“虚拟数据”。你可以初始化一个空数组。如下所示

    var myArray = [String]()

numberOfRowsInSection中返回myArray.count。如果count为零,则不会调用cellForRowAtIndexPath,您可以放心使用。

答案 1 :(得分:1)

默认情况下为3行。

var myArray:Array<String>? = ...

func numberOfSectionsInTableView(tableView: UITableView) -> Int {
    return 1
}

fun tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return myArray?.count ?? 3
}

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {        
    var cell = UITableViewCell()
    if let arrayStrings = myArray, arrayStrings.count > indexPath.row {
       cell.textLabel.text = arrayStrings[indexPath.row]
    } 
    return cell
}