如何通过 NSUserDefaults 将当前日期写入 UITableView 的 Cell?

How to write current date into Cell of UITableView through NSUserDefaults?

我希望用户通过单击按钮将当前日期(如 dd.mm.yyyy)保存到 NSUserDefaults,然后将其加载回另一个 ViewController 以将其显示为 UITableView 中的一个单元格。但这是行不通的。我不知道如何获得正确的日期,但这是我尝试过的:

@IBAction func saveButtonTapped (sender:AnyObject){

    let userDefaults = NSUserDefaults.standardUserDefaults()

    if var timeList = userDefaults.objectForKey("timeList") as? [NSDate]
    {
        timeList.append(NSDate())
        userDefaults.setObject(timeList, forKey: "timeList")
    }
    else
    {
        userDefaults.setObject([NSDate()], forKey: "timeList")
    }
    userDefaults.synchronize()
}

...

 @IBOutlet weak var tableView: UITableView!

var time:NSMutableArray = NSMutableArray();

override func viewDidLoad() {
    super.viewDidLoad()

    var timecopy = NSMutableArray(array: time)

    var userDefaults:NSUserDefaults = NSUserDefaults.standardUserDefaults()

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

    if ((timeListFromUserDefaults) != nil){
        time = timeListFromUserDefaults!
    }
    self.tableView.reloadData()
}

您在 NSUserDefaults 中输入的所有内容都会 保存 为不可变的。因此你会得到一个 NSArray 而不是 NSMutableArray。这可能会导致您的条件转换失败并且 return nil.

顺便说一句,考虑一下 NSUserDefaults 并不是要成为您应用程序的某种数据库,而只是一小部分 PropertyList 偏好和类似的东西。

如果您要保存、删除等大量日期,您可能应该考虑 CoreData 或其他解决方案。

给你。

class ViewController: UIViewController, UITableViewDataSource {

    @IBOutlet weak var tableView: UITableView!

    let userDefaults = NSUserDefaults.standardUserDefaults()
    let timeListKey = "TimeList" // Key in user defaults

    var timeList: [NSDate] = [NSDate]() {
        didSet {
            userDefaults.setObject(self.timeList, forKey: timeListKey)
            self.tableView.reloadData()
        }
    }


    //MARK: Actions

    @IBAction func saveButtonTapped(sender: UIButton) {
        self.timeList.append(NSDate())
    }


    //MARK: TableView DataSource
    func numberOfSectionsInTableView(tableView: UITableView) -> Int {
        return 1
    }
    func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return self.timeList.count
    }

    func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
        let cellIdentifier = "TimeListCell"
        let cell = tableView.dequeueReusableCellWithIdentifier(cellIdentifier, forIndexPath: indexPath) as UITableViewCell
        cell.textLabel?.text = "\(timeList[indexPath.row])"
        return cell
    }

    //MARK: View Lifecycle

    override func viewDidLoad() {
        super.viewDidLoad()
        // Get NSArray from userDefaults
        let timeListFromUserDefaults = userDefaults.objectForKey(timeListKey) as? NSArray
        // Check if it is an array of NSDate, else set timeList to empty array
        self.timeList = (timeListFromUserDefaults as? [NSDate]) ?? [NSDate]()
    }
}