使用NSUSerDefaults保存Swift TableView数据

时间:2016-03-07 15:18:28

标签: swift tableview nsuserdefaults

我在swift中有一个tableview。每个单元格都有不同文本的标签。选择单元格后,它会将文本传递给另一个视图控制器上的标签。我可以使用按钮(保存数据)保存此数据,并使用另一个按钮(加载数据)加载保存的数据。

我的问题是我最好不要使用按钮,但是在加载视图时会自动加载数据。但是,当我将NSUSerDefaults代码放在viewDidLoad()中时,它会保存数据但我不再能够更改选择,即它会永久加载第一个选择。我已经在下面发布了我的代码,用于目标ViewController和TableViewController。

的ViewController

import UIKit

class DetailViewController: UIViewController {

    @IBOutlet weak var detailLabel: UILabel!

    var passedValue: String?

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
        detailLabel.text = passedValue
    }

    @IBAction func saveDataClicked(sender: AnyObject) {
        var defaults: NSUserDefaults = NSUserDefaults.standardUserDefaults()

        defaults.setObject(self.detailLabel.text, forKey: "optionValue")
    }

    @IBAction func loadDataClicked(sender: AnyObject) {
        var defaults: NSUserDefaults = NSUserDefaults.standardUserDefaults()

        if let optionValueIsNotNill = defaults.objectForKey("optionValue") as? String {
            self.detailLabel.text = defaults.objectForKey("optionValue") as! String
        }
    }   
}

TableViewController

import UIKit

class TableViewController: UITableViewController {

    var valueToPass:String! 

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
    }

    override func numberOfSectionsInTableView(tableView: UITableView) -> Int {
        return 1
    }

    override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return 3
    }

    override func tableView(tableView: UITableView!, didSelectRowAtIndexPath indexPath: NSIndexPath!) {

        // Get Cell Label
        let indexPath = tableView.indexPathForSelectedRow;
        let currentCell = tableView.cellForRowAtIndexPath(indexPath!) as UITableViewCell!;

        valueToPass = currentCell.textLabel!.text
        performSegueWithIdentifier("showDetailView", sender: self)

    }

    override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?){
        if segue.identifier == "showDetailView" {

            // initialize new view controller and cast it as your view controller
            var viewController = segue.destinationViewController as! DetailViewController
            // your new view controller should have property that will store passed value
            viewController.passedValue = valueToPass

        }
    }
}

1 个答案:

答案 0 :(得分:0)

如果您想将所选数据保存到NSUSerDefaults您应该在didSelectRowAtIndexPath中编写保存代码,如下所示

如果您具有在NSUserDefaults中保存数据的功能

save(DataArray[indexPath.row])

然后它将被保存,但我认为如果您的数据仅在应用程序运行时使用,我认为使用的最佳选择是静态实例。