【问题标题】:Adding things to NSUserDefaults - multiple views向 NSUserDefaults 添加东西 - 多个视图
【发布时间】:2015-09-12 22:38:53
【问题描述】:

我正在创建一个类似字典的应用程序,我想使用 NSUserDefaults 存储用户的搜索历史记录。我在课堂外创建了一个seaechHistory 数组。现在我追加searchHistory 数组并使用willSelectRowAtIndexPath 中的NSUserDefaults 保存它,然后在历史视图中检索存储的历史。存储工作正常,但是当我重新运行应用程序时,NSUserDefaults 将seachHistory 设置为空数组,因此我丢失了所有保存的数据。 synchronize() 方法在任何地方都可以工作。

初始视图控制器:

 import UIKit

var searchHistory = [String]()


class ViewController: UIViewController, UITableViewDataSource, UITableViewDelegate, UITextFieldDelegate {


    @IBOutlet weak var tableView: UITableView!
    @IBOutlet var textField: UITextField!

    @IBAction func textFieldDidChange(sender: AnyObject) {
        tableView.hidden = false
        searchManager.updateFilter(textField.text)
        tableView.reloadData()
    }

    @IBAction func tapOnTextField(sender: AnyObject) {

        let textFieldLength = count(textField.text)

        if textFieldLength == 0 {
            tableView.hidden = true

        } else {
        tableView.hidden = false
        }
    }


    override func viewDidLoad() {

        super.viewDidLoad()

        textField.backgroundColor = UIColor.whiteColor()

        tableView.hidden = true

        self.textField.delegate = self

    }


    var searchManager = SearchManager()


    func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return searchManager.filteredURLCount()
    }


    func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {

        let cell = UITableViewCell(style: UITableViewCellStyle.Default, reuseIdentifier: "Cell")

        cell.textLabel!.text = searchManager.filteredURLAtIndex(indexPath.row)

        return cell
    }


    func tableView(tableView: UITableView, willSelectRowAtIndexPath indexPath: NSIndexPath) -> NSIndexPath? {
        self.textField.text = searchManager.filteredURLAtIndex(indexPath.row)

        searchHistory.append(textField.text)

        NSUserDefaults.standardUserDefaults().setObject(searchHistory, forKey: "History")

        self.performSegueWithIdentifier("cellTapped", sender: "Cell")

        textField.text = nil
        tableView.hidden = true
        textField.resignFirstResponder()

        return indexPath
    }


    override func touchesBegan(touches: Set<NSObject>, withEvent event: UIEvent) {
        self.view.endEditing(true)
        self.tableView.hidden = true
    }

    func textFieldShouldReturn(textField: UITextField) -> Bool {
        textField.resignFirstResponder()
        return true
    }


    override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
        if segue.identifier == "cellTapped" {
        var DestViewController: definitionView = segue.destinationViewController as! definitionView
        DestViewController.searchWord = textField.text
        } 
    }


}

历史视图控制器:

    import UIKit

class historyView: UIViewController {


    override func viewDidLoad() {
        super.viewDidLoad()

        searchHistory  = NSUserDefaults.standardUserDefaults().objectForKey("History")! as! [String]
        println(searchHistory)

    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }


    override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
        var destination: ViewController = segue.destinationViewController as! ViewController

    }

}

【问题讨论】:

  • 根据您的代码,您得到的正是我所期望的。每次启动应用程序时,您的代码都以空数组开头。另一方面,您似乎确切地知道如何阅读保存的字典。那么为什么在初始化数组时不这样做呢?
  • @gasher729 谢谢,但我该怎么做呢?我是否获取保存的数据并再次保存?请帮忙。

标签: ios arrays swift nsuserdefaults


【解决方案1】:

您可以在 viewDidLoad() 方法中读取您的数组,然后它不会为空。

在你的 ViewController 中添加代码:

override func viewDidLoad() {
    super.viewDidLoad()
    searchHistory = NSUserDefaults.standardUserDefaults().objectForKey("History")! as! [String]
}

它应该可以工作。

【讨论】:

  • 谢谢,但它仅在我在查找单词之前加载历史视图控制器时才有效,如果我在重新运行应用程序后直接查找作品,历史将再次丢失。你有什么其他的建议?谢谢!
  • 您能否发布整个代码,以便我更好地理解您的问题?
  • 您必须将这行代码添加到您的初始 VC viewDidLoad 方法中,而不是添加到历史 VC。 searchHistory = NSUserDefaults.standardUserDefaults().objectForKey("History")! as! [String]
  • 哈哈,我已经修好了,它成功了!非常感谢你的聪明人!
  • @mikle94 NSUserDefaults 有一个名为 stringArrayForKey 的方法。无需从对象转换为字符串数组。您不应该打开包装,它可能会使您的应用程序崩溃。我推荐使用 if let 和 stringArrayForKey。 developer.apple.com/library/ios/documentation/Cocoa/Reference/…:
猜你喜欢
  • 2013-10-20
  • 2012-08-11
  • 1970-01-01
  • 2013-01-27
  • 2020-09-02
  • 1970-01-01
  • 2023-03-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多