【问题标题】:How to write current date into Cell of UITableView through NSUserDefaults?如何通过 NSUserDefaults 将当前日期写入 UITableView 的 Cell?
【发布时间】:2015-02-07 13:28:16
【问题描述】:

我希望用户通过单击一个按钮将当前日期(如 dd.mm.yyyy)保存到 NSUserDefaults 并将其加载回另一个 ViewController 以将其显示为 @987654323 中的单元格@。但它不会起作用。我不知道如何正确设置日期,但这是我尝试过的:

@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()
}

【问题讨论】:

    标签: ios uitableview swift nsdate nsuserdefaults


    【解决方案1】:

    你去。

    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]()
        }
    }
    

    【讨论】:

    • 注意我没有明确synchronize,因为当你的应用程序进入后台或操作系统认为可以这样做时,它会自动发生。这是你应该做的。如果您的应用程序崩溃,用户默认设置将不会被保存……您可能希望这样做,因为崩溃可能是由于您的默认设置中的数据造成的。如果这些被保存,那么应用程序将继续崩溃,直到用户将其从设备中删除。
    【解决方案2】:

    您放入NSUserDefaults 的所有内容都保存为不可变。因此,您将返回 NSArray 而不是 NSMutableArray。这可能会导致您的条件转换失败并返回nil

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

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

    【讨论】:

    • 1. “var timecopy = NSMutableArray(array: time)” 不会对加载的数组进行可变副本吗? 2. 我知道,但这是我的第一个应用程序,所以我尽量保持简单。与 CoreData 相比,使用 NSUserDefaults 会对用户产生什么负面影响?
    • @santa1 我认为userDefaults.objectForKey("timeList") as? NSMutableArray 返回nil,因为它从NSUserDefaults 获得NSArray。我不需要var timecopy = NSMutableArray(array: time):它只是创建了一个永远不会被使用的time 的副本。
    • @santa1 NSUserDefaults 是序列化的属性列表,可以将其视为 XLM 文件。随着数据的增长,搜索、排序、删除和典型的数据库操作将变得非常低效。由于您使用共享实例standardUserDefaults,因此您以后在更改数据模型时可能会遇到麻烦。
    • 谢谢。我已经删除了副本。我明白你的意思是使用核心数据,但 atm 我想保持简单并让我的 NSUserDefaults 工作。因此,如果您有其他想法,我的代码可能有什么问题,请告诉我。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多