UIPickerView 不会显示从 NSUserDefaults 加载的数据
UIPickerView won't show the data loaded from NSUserDefaults
编辑:
我昨晚尝试设置 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 应该 return 练习的地方它是空的。这里需要一些帮助。
不要使用NSUserDefaults
传递变量。
将public 属性(在.h文件中)添加到destinationViewController
并设置属性为[=12=中的值(数组) ].
要在应用程序启动之间保存数组,请按照@Martin 的建议,将数组写入文档 directory.There 这里有很多关于该信息的答案。
如何使用 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
如何delete/reset 使用 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]"
}
我想我明白了。
在您的代码中,您从 viewDidAppear
中的 UserDefaults 读取了 exercises
,它将在 func pickerView(...) -> String!
被调用后被调用。这就是为什么 func pickerView(...) -> String!
中的练习总是空的。
要正确执行此操作,您需要在 init()
或 viewDidLoad()
中初始化练习
编辑:
我昨晚尝试设置 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 应该 return 练习的地方它是空的。这里需要一些帮助。
不要使用NSUserDefaults
传递变量。
将public 属性(在.h文件中)添加到destinationViewController
并设置属性为[=12=中的值(数组) ].
要在应用程序启动之间保存数组,请按照@Martin 的建议,将数组写入文档 directory.There 这里有很多关于该信息的答案。
如何使用 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
如何delete/reset 使用 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]"
}
我想我明白了。
在您的代码中,您从 viewDidAppear
中的 UserDefaults 读取了 exercises
,它将在 func pickerView(...) -> String!
被调用后被调用。这就是为什么 func pickerView(...) -> String!
中的练习总是空的。
要正确执行此操作,您需要在 init()
或 viewDidLoad()