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

时间:2015-01-22 20:20:02

标签: ios arrays xcode swift save

修改

我昨晚试图设置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应该返回练习的位置它是空的。需要一些帮助。

3 个答案:

答案 0 :(得分:0)

不要使用NSUserDefaults来传递变量。

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

要在应用程序启动之间保存数组,请执行@Martin建议,将数组写入Documents目录。这里有很多答案。

答案 1 :(得分:0)

如何使用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]"
}

答案 2 :(得分:0)

我想我已经有了这个。

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

要正确执行此操作,您需要在init()viewDidLoad()

中初始化练习