Swift 1.2 - 根据 NSUserDefaults 值更新 UIPickerView 初始行

Swift 1.2 - Updating the UIPickerView initial row according to NSUserDefaults value

编辑: 需要说明的是,这不是重复的。 我的问题不是 saving/retriving 数据,而是在 Swift 中显示正确的 UIPickerView 行 ,不再需要 1.2 同步(如堆栈溢出的许多答案中所述) )

在我的应用程序中,我使用 pickerViewv 设置地理定位数据应显示的半径。 我将该半径值保存在 NSUserDefaults 中。 在我看来,我成功地保存了这样的设置(由 printl 检查),但我想更新 UIPicker,以便用户了解当前设置。此时选择器默认总是显示 5(即使 key 的值是另一个)。

编辑 2: 这解决了我的问题,多亏了答案。在 viewWillAppear

switch kRadiusMessages {
        case 5.0:
            self.pickerView.selectRow(0, inComponent: 0, animated: true)
        case 10.0:
            self.pickerView.selectRow(1, inComponent: 0, animated: true)
        case 15.0:
            self.pickerView.selectRow(2, inComponent: 0, animated: true)
        case 20.0:
            self.pickerView.selectRow(3, inComponent: 0, animated: true)
        default:
            self.pickerView.selectRow(0, inComponent: 0, animated: true)
        }

这是原来的起始代码:

   import UIKit

class SingleSettingsTVC: UITableViewController, UIPickerViewDelegate, UIPickerViewDataSource {


    var pickerDataSource = ["5 km", "10 km", "15 km", "20 km"]

    let defaults = NSUserDefaults.standardUserDefaults()
    var kRadiusMessages : Double!


    override func viewDidLoad() {
        super.viewDidLoad()

        self.pickerView.dataSource = self
        self.pickerView.delegate = self

        kRadiusMessages = defaults.doubleForKey("radiusForMessages")
        println("SingleSettingsTVC kRadiusMessages is \(kRadiusMessages)")


    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
    }


    @IBOutlet weak var pickerView: UIPickerView!


    func numberOfComponentsInPickerView(pickerView: UIPickerView) -> Int {
        return 1
    }

    func pickerView(pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
        return pickerDataSource.count
    }

    func pickerView(pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String! {
        return pickerDataSource[row]
    }




    func pickerView(pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int)
    {
        if(row == 0)
        {
            self.view.backgroundColor = UIColor.whiteColor()
            defaults.setDouble(5.0, forKey: "radiusForMessages")
            self.kRadiusMessages = defaults.doubleForKey("radiusForMessages")
            println("value for kRadiusMessages is : *\(kRadiusMessages)*")

        }
        else if(row == 1)
        {
            self.view.backgroundColor = UIColor.redColor()
            defaults.setDouble(10.0, forKey: "radiusForMessages")
            self.kRadiusMessages = defaults.doubleForKey("radiusForMessages")
            println("value for kRadiusMessages is : *\(kRadiusMessages)*")
        }
        else if(row == 2)
        {
            self.view.backgroundColor =  UIColor.greenColor()
            defaults.setDouble(15.0, forKey: "radiusForMessages")
            self.kRadiusMessages = defaults.doubleForKey("radiusForMessages")
            println("value for kRadiusMessages is : *\(kRadiusMessages)*")
        }
        else if(row == 3)
        {
            self.view.backgroundColor =  UIColor.greenColor()
            defaults.setDouble(20.0, forKey: "radiusForMessages")
            self.kRadiusMessages = defaults.doubleForKey("radiusForMessages")
            println("value for kRadiusMessages is : *\(kRadiusMessages)*")
        }
        else
        {
            self.view.backgroundColor = UIColor.blueColor()
        }
    }

}

NSUserDefaults 中设置值后,您需要同步它。 保存数据后放入下面的行,然后尝试检索。

if(row == 0)
{
     self.view.backgroundColor = UIColor.whiteColor()
     defaults.setDouble(5.0, forKey: "radiusForMessages")
     defaults.synchronize()
     self.kRadiusMessages = defaults.doubleForKey("radiusForMessages")
      println("value for kRadiusMessages is : *\(kRadiusMessages)*")
}

已编辑:您可以使用以下行设置初始行

self.pickerView.selectRow(0, inComponent: 0, animated: true)

希望对您有所帮助!