2015-02-07 42 views
0

我希望用户通过单击按钮将当前日期(如dd.mm.yyyy)保存到NSUserDefaults,并将其重新加载到另一个ViewController以在UITableView中将其显示为单元格。但它不会工作。我不知道怎么弄的日期正确,但是这是我的尝试:你把NSUserDefaults如何通过NSUserDefaults将当前日期写入UITableView的Cell?

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

回答

0

你走了。

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

注意我没有明确说明“同步”,因为当你的应用程序在后台运行或者操作系统认为可以这样做时它会自动发生。这是你应该怎么做的。如果你的应用程序崩溃了,用户的默认值将不会被保存...并且可能你需要这个,因为崩溃可能是由于你的默认数据。如果那些被保存的应用程序将继续崩溃,直到用户从设备中删除它。 – 2015-02-07 16:48:48

0

一切都是保存为不可变的。因此,您将收回NSArray而不是NSMutableArray。这可能会导致您的条件转换失败并返回nil

顺便说一下,考虑到NSUserDefaults并不是针对您的应用的某种数据库,而只是一个小的PropertyList的优先级和类似的东西。

如果你打算有很多日期来保存,删除等,你应该考虑CoreData或其他解决方案。

+0

1.不是“var timecopy = NSMutableArray(array:time)”是否生成加载数组的可变副本? 2.我意识到这一点,但这是我的第一个应用程序,所以我尽量保持简单。与CoreData相比,NSUserDefaults对用户有什么负面影响? – santa1 2015-02-07 13:41:56

+0

@ santa1我认为'userDefaults.objectForKey(“timeList”)为? NSMutableArray'返回'nil',因为它从'NSUserDefaults'中获取'NSArray'。我不需要'var timecopy = NSMutableArray(array:time)':它只是创建一个永远不会被使用的'time'的副本。 – 2015-02-07 14:06:41

+0

@ santa1'NSUserDefaults'是序列化属性列表,可以认为它是一个XLM文件。随着数据的增长,搜索,排序,删除和典型的数据库操作将变得非常低效。由于您使用共享实例'standardUserDefaults',因此在未来更改数据模型时可能会遇到麻烦。 – 2015-02-07 14:11:31

相关问题