UIPickerView 不会显示从 NSUserDefaults 加载的数据

Posted

技术标签:

【中文标题】UIPickerView 不会显示从 NSUserDefaults 加载的数据【英文标题】:UIPickerView won't show the data loaded from NSUserDefaults 【发布时间】:2015-01-22 20:20:01 【问题描述】:

编辑:

我昨晚尝试设置 NSUserDefaults 但错误不断出现:

ViewController3:

保存数据

 @IBAction func addButtonTapped(sender: UIButton) 
    var userDefaults:NSUserDefaults = NSUserDefaults.standardUserDefaults()

    var itemList:NSMutableArray? = userDefaults.objectForKey("exercisesList") as? NSMutableArray

    var dataSet:NSMutableDictionary = NSMutableDictionary()
    dataSet.setObject(textField.text, forKey: "exercises")

    if ((itemList) != nil) 
        var newMutableList:NSMutableArray = NSMutableArray();

        for dict:AnyObject in itemList!
            newMutableList.addObject(dict as NSDictionary)
        

        userDefaults.removeObjectForKey("exercisesList")
        newMutableList.addObject(dataSet)
        userDefaults.setObject(newMutableList, forKey: "exercisesList")

    else 
        userDefaults.removeObjectForKey("exercisesList")
        itemList = NSMutableArray()
        itemList!.addObject(dataSet)
        userDefaults.setObject(itemList, forKey: "exercisesList")
    

    userDefaults.synchronize()

    self.view.endEditing(true)
    textField.text = ""


ViewController1:

加载数据

 var exercises:NSMutableArray = NSMutableArray();


override func viewDidAppear(animated: Bool) 
    var userDefaults:NSUserDefaults = NSUserDefaults.standardUserDefaults()

    var itemListFromUserDefaults:NSMutableArray? = userDefaults.objectForKey("itemList") as? NSMutableArray

    if ((itemListFromUserDefaults) != nil)
        exercises = itemListFromUserDefaults!
    

现在我想将加载的数据用于 UIPickerView

 func pickerView(pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String! 
    switch pickerView 
    case pickerView1:
        return exercises[row] as String
    case pickerView2:
        return reps[component][row]
    case pickerView3:
        return weight[component][row]
    default:
        assertionFailure("Unknown pickerView")
    

但是在 UIPickerView 应该返回练习的地方它是空的。在这里需要一些帮助。

【问题讨论】:

"如何存储添加的练习" - 存储多长时间?稍后在应用程序的同一运行中?甚至在应用程序终止之后?我的意思是,var exercises存储,那么在什么意义上问题还没有解决? NSArray 有一个 writeToFile() 方法... ...看看***.com/questions/24246749/…。 @matt :请看一下我的编辑。信息应在关闭应用程序后存储在应用程序中,直到用户将其删除。 将 JSON 字符串写入文件。 【参考方案1】:

我想我明白了。

在您的代码中,您从 viewDidAppear 中的 UserDefaults 中读取了 exercises,这将在 func pickerView(...) -> String! 被调用后被调用。这就是为什么func pickerView(...) -> String!的练习总是空的。

要正确执行此操作,您需要在init()viewDidLoad() 中初始化练习

【讨论】:

那么我还有什么其他选择?我知道我可以编写 viewDidLoad (如果这会改变任何东西),但这意味着数据只会被加载一次。 @santa1 你也可以写在func pickerView()->String中。它会“更慢”,但肯定可以接受。通过更多的优化(缓存或其他东西),性能应该不是问题。 那么在 NSUserDefault 的函数中重新加载选择器视图的数据又如何呢?这可能吗? 编辑:我已经按照您的建议进行了尝试,但似乎还有其他问题。就是不知道是什么。 @santa1 我猜选择器视图不止一个,它们需要动态更改。如果有什么东西可以触发改变,只使用pickerView.reloadAllComponents 可以吗?【参考方案2】:

不要使用NSUserDefaults 传递变量。

将公共属性(在 .h 文件中)添加到 destinationViewController,并使用 prepareForSegue 中的值(数组)设置该属性。

要在应用程序启动之间保存数组,请按照@Martin 的建议将数组写入 Documents 目录。这里有很多关于该信息的答案。

【讨论】:

如果您想在应用程序关闭后使用它,请将其保存在 coreData 中 @NSSakly:你能举个例子吗? 不要使用核心数据。它不是初学者工具。 我确认,我只看到您的编辑说明,您是初学者。没有解决方案,只有用户 NSUserDefault 我按照建议尝试了,但我不太确定它是否工作,因为错误不断发生。请看一下我编辑的问题。谢谢【参考方案3】:

如何使用 NSUserDefaults 存储您的数组非常简单,我鼓励您尝试一下。

var exercises = ["A","B","C"]
NSUserDefaults.standardUserDefaults().setObject(exercises, forKey: "exercises")

如何使用 NSUserDefaults 加载字符串数组

if let myLoadedStringArray = NSUserDefaults.standardUserDefaults().stringArrayForKey("exercises")
    println(myLoadedStringArray)   // "[A, B, C]"

// Note: myLoadedStringArray has no value outside curly brackets

如何删除/重置使用 NSUserDefaults 存储的值

NSUserDefaults.standardUserDefaults().removeObjectForKey("exercises")

println(NSUserDefaults.standardUserDefaults().stringArrayForKey("exercises"))    // "nil"

如果您喜欢将其作为文件存储在文档文件夹中,您可以按照以下方式进行操作

let fileUrl = (NSFileManager.defaultManager().URLsForDirectory(.DocumentDirectory, inDomains: .UserDomainMask).first! as NSURL).URLByAppendingPathComponent("exercises.db")
(exercises as NSArray).writeToURL(fileUrl, atomically: true)  // true
// forced unwrap if you are sure it won't return nil
let loadedArray = NSArray(contentsOfURL: fileUrl)! as [String]
// or use if let to safely unwrap your array
if let loadedArray = NSArray(contentsOfURL: fileUrl) as? [String] 
    println(loadedArray)  // "[A, B, C]"

【讨论】:

我按照您的建议进行了尝试,但我不太确定它是否有效,因为错误不断发生。请看一下我编辑的问题。谢谢!

以上是关于UIPickerView 不会显示从 NSUserDefaults 加载的数据的主要内容,如果未能解决你的问题,请参考以下文章

NSUser Defaults 保存按钮状态并再次显示

使用 NSUser Defaults 保存当前游戏分数(不是高分)?

ios UiPickerView 与 CountryPicker 类

UIPickerView 不会立即重绘未选中的行

使用 UIButton 从 UIPickerView 向 UILabel 显示输出

从 UIPickerView 中选择的 NSTimer 在 UILabel 中显示秒数