致命错误:在展开可选值时意外发现nil - UITableView添加按钮

时间:2015-07-22 11:27:55

标签: ios swift uitableview

我正在尝试将名称添加到UITableView中。名称将存储为NSUserDefault

我的viewDidLoad:

var PlayersUserDefault = NSUserDefaults.standardUserDefaults()
if (PlayersUserDefault.arrayForKey("playersKey") != nil){
    players = PlayersUserDefault.arrayForKey("playersKey")
}

添加名称按钮:

@IBAction func addButtonAction(sender: AnyObject) {
    players!.append(namesTextBox.text)
    myTableView.reloadData()
}

当我按下addButtonAction时,我收到以下错误:

players!.append(namesTextBox.text)

玩家声明:

var players = NSUserDefaults().arrayForKey("playersKey")

知道我为什么会收到错误吗? 错误图片: enter image description here

3 个答案:

答案 0 :(得分:1)

在一行中使用NSUserDefaults.standardUserDefaults(),在另一行中创建NSUserDefaults的新实例,并要求" playersKey"。你应该做的是使用NSUserDefaults.standardUserDefaults()来检索并保存你的玩家。

看一下反思: https://developer.apple.com/library/ios/documentation/Cocoa/Reference/Foundation/Classes/NSUserDefaults_Class/#//apple_ref/doc/constant_group/NSUserDefaults_Domains

对于init:

  

此方法不会在搜索列表中放置任何内容。仅调用它   如果你已经分配了自己的NSUserDefaults实例而不是使用   共享的。

和共享实例:

  

如果共享默认对象尚不存在,则使用a创建   包含以下域名的搜索列表,在此处   顺序:

     
      
  • NSArgumentDomain,由从应用程序解析的默认值组成   参数

  •   
  • 由应用程序的包标识符

  • 标识的域   
  • NSGlobalDomain,由默认值组成,供所有人查看   应用

  •   
  • 为每个用户首​​选语言分隔域

  •   
  • NSRegistrationDomain,一组临时默认值,其值可以是   由应用程序设置,以确保始终进行搜索   成功

  •   
     

为当前用户初始化默认值。随后   即使在以下情况下,对标准搜索列表的修改仍然有效   再次调用此方法 - 保证搜索列表   标准仅在第一次调用此方法时。

答案 1 :(得分:1)

玩家阵列在时间点是零,这就是为什么阵列没有被打开的原因。如果你是第一次点击按钮,你的UserDefaults将没有玩家,所以players数组是零。所以你可以通过两种方式解决这个问题。

  1. viewDidLoad()

    var PlayersUserDefault = NSUserDefaults.standardUserDefaults()
    if (PlayersUserDefault.arrayForKey("playersKey") != nil){
         players = PlayersUserDefault.arrayForKey("playersKey")
    }else {
         players = [String]()
    }
    
  2. 否则,使用如下所示的空字符串数组初始化players数组:

     var players = [String]()
    
  3. 这可能会对你有帮助。

答案 2 :(得分:0)

在尝试执行append之前,您可以尝试展开玩家的价值。然后,您将确定它是否nil

尝试:

@IBAction func addButtonAction(sender: AnyObject) {
    if let playerValue = players {
        players!.append(namesTextBox.text)
        myTableView.reloadData()
    }else{
        println("players is nil!")
    }
}