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

Posted

技术标签:

【中文标题】如何在 UITableView 中安全地使用未初始化的数组并显示一个空表【英文标题】:How can I safely use an un-initialized array in a UITableView and show an empty table 【发布时间】:2016-09-20 12:17:02 【问题描述】:

当数组为空并且您从 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 中使用未初始化的数组并显示一个空表?

【问题讨论】:

如果您的myArray 没有任何元素,那么它肯定会显示空表! return myArray.count in numberOfRowsInSection 确保了这一点。 这不会在某些时候使应用程序崩溃吗?我已经看到由于使用未初始化的数组而导致的错误/崩溃。 @NSNoob,我明白了,谢谢。 @fs_tigre 我虽然你想在视图中保留空行... :) 【参考方案1】:

无需将“虚拟数据”放入您的数组中。您可以只初始化一个空数组。如下所示

    var myArray = [String]()

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

【讨论】:

【参考方案2】:

默认为 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

【讨论】:

很高兴知道您可以添加空行。谢谢

以上是关于如何在 UITableView 中安全地使用未初始化的数组并显示一个空表的主要内容,如果未能解决你的问题,请参考以下文章

使用 ORM 时,如何安全地跨层发送加载的实体

如何初始化 UITableView?来自 XIB 和以编程方式?

如何针对负值安全地更新未签名记录?

具有动态数据初始化的 UiTableviewCell 未正确加载

Django:从数据库中安全地删除未使用的表

如何初始加载 UITableView 然后观察 Firebase 节点以更改在 Swift 中刷新 tableview?