Swift:如何使用NSUserDefaults为表视图中的每个单元格存储单独的信息

时间:2016-07-02 20:17:18

标签: ios swift

如果可以,请提前感谢帮助我。我对Swift仍然很陌生,但期待快速学习,所以我可以在论坛上帮助其他人。

目前,我有一个问题需要解决,我不知道从哪里开始。假设,我的目标是实现以下目标:

第一个视图:用户输入他们访问过的城市名称

第二个视图:用户输入他们在该城市看到的博物馆名称

然后,每当用户在第一个视图上选择一个城市时,将显示存储的“博物馆”信息。

到目前为止,我已经设法使NSUserDefaults正常运行,但无论我从初始View列表中选择的单元格如何,都会显示相同的数据。

我在整个应用程序中使用数组的特定名称来存储,显示和读取来自NSUserDefaults的数据,我想知道编辑它的最佳方法,以便应用程序检查我选择的单元格,然后显示适当的信息(如果没有为该单元输入任何信息,则为无)。

我希望这是一个很好的解释,我知道很久很抱歉。以下是我的代码。欢迎任何意见或建议。谢谢!

import UIKit
import Foundation

class DetailViewController: UIViewController, UITableViewDelegate, UITableViewDataSource, UITextFieldDelegate {

    @IBOutlet weak var titleLabel: UILabel!
    @IBOutlet weak var detailTextField: UITextField!
    @IBOutlet weak var detailTableView: UITableView!

    var receivedString:String = ""        
    var cell0Array:[NSString] = []

    override func viewDidLoad() {
        super.viewDidLoad()
        detailTextField.delegate = self
        detailTableView.delegate = self
        detailTableView.dataSource = self

        titleLabel.text = receivedString

        if NSUserDefaults.standardUserDefaults().objectForKey("cell0Array") != nil {
        cell0Array = NSUserDefaults.standardUserDefaults().objectForKey("cell0Array") as! [NSString]
        } else {
        }
    }

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

    func textFieldShouldReturn(textField: UITextField) -> Bool {

        let now = NSDate()

        let formatter = NSDateFormatter()

        formatter.dateStyle = .MediumStyle
        formatter.timeStyle = .NoStyle

        let date = formatter.stringFromDate(now)

        let detailTextFieldContents = detailTextField.text
        let token = "\(date): \(detailTextFieldContents!)lb"
        cell0Array.insert(token, atIndex: 0)

        NSUserDefaults.standardUserDefaults().setObject(cell0Array, forKey: "cell0Array")
        NSUserDefaults.standardUserDefaults().synchronize()

        detailTextField.text = ""
        detailTextField.resignFirstResponder()

        self.detailTableView.reloadData()

        return true
    }

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

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

    func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
        let detailCell = tableView.dequeueReusableCellWithIdentifier("detailCell", forIndexPath: indexPath)

        let detailItem = cell0Array[indexPath.row]

        detailCell.textLabel!.text = detailItem as String
        detailCell.textLabel!.textAlignment = .Center

        self.view.layoutIfNeeded()
        return detailCell
    }


}

1 个答案:

答案 0 :(得分:0)

这一行有一个明显的问题:

func textFieldShouldReturn(textField: UITextField) -> Bool {
    // ...
    cell0Array.insert(token, atIndex: 0)
    // ...
}

不是弄清楚这个文本字段的单元格所在的表的哪一行,而是将值放在该索引处,而是始终在索引0处插入token。因此,行和条目之间没有对应关系。 cell0Array