UIPickerView 不会显示从 NSUserDefaults 加载的数据 - 加载数据时应用程序崩溃 [英] UIPickerView won't display the data loaded from NSUserDefaults - App is crashing while loading data

查看:43
本文介绍了UIPickerView 不会显示从 NSUserDefaults 加载的数据 - 加载数据时应用程序崩溃的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我第一次尝试在带有 UIPickerViews 的应用中使用 NSUserDefaults.但是应用程序在测试时崩溃/数据未显示在 PickerView 中.我仍然尝试自己修复它,但一些帮助会很棒.

ViewController3:用户应将数据保存到 NSUserDefault 的位置.因此有一个 textField 来写下一些东西和一个保存按钮"

class ViewController3: UIViewController, UITextFieldDelegate {

@IBOutlet weak var textField: UITextField!

...

 @IBAction func tappedAddButton(sender: AnyObject) {

    var userDefaults:NSUserDefaults = NSUserDefaults.standardUserDefaults()

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

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

    if ((exercisesList) != nil){
        var newMutableList:NSMutableArray = NSMutableArray();

        for dict:AnyObject in exercisesList!{
            newMutableList.addObject(dict as NSDictionary)
        }

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

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

    userDefaults.synchronize()

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

}

视图控制器 1:保存的数据应该从 NSUserDefaults 加载并显示在 pickerView1 中

class ViewController: UIViewController,UIPickerViewDelegate {

@IBOutlet weak var pickerView1: UIPickerView!
@IBOutlet weak var pickerView2: UIPickerView!
@IBOutlet weak var pickerView3: UIPickerView!

var reps = [["1","2","3","4","5","6","7","8","9","10","11","12","13","14","15","16","17","18","19","20","21","22","23","24","25"],["x"]]

var weight = [["0","1","2","3","4","5"],["0","1","2","3","4","5","6","7","8","9"],["0","1","2","3","4","5","6","7","8","9"],[","],["0","25","5","75"],["kg","lbs"]]

var exercises:NSMutableArray = NSMutableArray();

override func viewDidLoad() {
    super.viewDidLoad()

    var userDefaults:NSUserDefaults = NSUserDefaults.standardUserDefaults()

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

    if ((exercisesListFromUserDefaults) != nil){
        exercises = exercisesListFromUserDefaults!
    }
    self.pickerView1.reloadAllComponents()
}

func numberOfComponentsInPickerView(pickerView: UIPickerView) -> Int {

    switch pickerView {
    case pickerView1:
        return 1
    case pickerView2:
        return reps.count
    case pickerView3:
        return weight.count
    default:
        assertionFailure("Unknown pickerView")
    }
}

func pickerView(pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
    switch pickerView {
    case pickerView1:
        return exercises.count
    case pickerView2:
        return reps[component].count
    case pickerView3:
        return weight[component].count
    default:
        assertionFailure("Unknown pickerView")
    }
}

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")
    }
}

}

推荐答案

pickerViews 为空的原因很可能,因为您没有将它们作为数据源和委托连接到 viewController1.您可以在故事板或代码中执行此操作:

The reason that your pickerViews are empty is most likely because you have not wired them up to viewController1 as dataSource and delegate. You can do this in the storyboard or in code:

override  func viewDidLoad() {
    super.viewDidLoad()
    let pickers = [pickerView1,pickerView2,pickerView3]
    for i in 0...2 {
        let pickerView : UIPickerView = pickers[i]
        pickerView.dataSource = self
        pickerView.delegate = self
    }
}

更新(第 3 部分)

exercisesList 是一个字典数组.例如,您正在向练习列表添加一个新项目:

exercisesList is an array of dictionaries. Here for example you are adding a new item to exercisesList:

 newMutableList.addObject(dataSet)

数据集的创建/定义如下:

where dataSet is created/defined as follows:

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

所以你有一个单项字典,键是练习".

so you have a single-item dictionary, with the key "exercises".

然后在 viewController1 中解压数组并假设它填充了字符串,而不是字典:

Then in viewController1 you are unpacking the array and assuming it is populated with strings, not dictionaries:

return exercises[row] as String

这里是将字典转换为字符串,结果崩溃了.

Here you are casting a dictionary to a string, which is crashing out.

线索在堆栈跟踪行 swift dynamic cast failed在这些行中

The clue is in the stack trace line swift dynamic cast failed and in these lines

 (ObjectiveC.UIPickerView, titleForRow : Swift.Int, forComponent:     
 Swift.Int) => Swift.ImplicitlyUnwrappedOptional<Swift.String>

如果您从字典键exercises"中正确提取字符串作为值,它将起作用:

It will work if you correctly extract the string as a value from the dictionary key "exercises":

        return exercises[row]["exercises"] as String

或者,您可以使用字符串而不是字典来填充数组(因为每个条目只有一个条目).

Alternatively you could populate the array with strings instead of dictionaries (as you only have one entry per entry).

希望你现在可以在不崩溃的情况下运行它!

Hopefully you can run this without crashing now!

这篇关于UIPickerView 不会显示从 NSUserDefaults 加载的数据 - 加载数据时应用程序崩溃的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆