概述: 我正在开发我的第一个应用程序它收集用于跟踪自行车骑行的用户位置信息。我将内容保存为.txt文件(坐标信息和属性信息)然后,用户可以将其数据导出iOS应用程序以进行进一步分析。我已成功添加了一个保存文本文件函数来存储信息。
正在使用的应用 用户输入自定义标题,然后将该名称附加到列出所有录制的游乐设施的tableview。在骑行创建中我称之为NSUserDefaults,这很关键,如果不调用NSUserDefaults,骑行名称不会附加到列出所有游乐设施的tableview。
let saveAction = UIAlertAction(title: "Save", style: .Default,
handler: { (action:UIAlertAction) -> Void in
// Allow for text to be added and appended into the RideTableViewController
let textField = alert.textFields!.first
rideContent.append(textField!.text!)
// Update permanent storage after deleting a ride
NSUserDefaults.standardUserDefaults().setObject(rideContent, forKey: "rideContent")
现在,当用户查看过去的游乐设施时,他们可以选择旧的游乐设施,这会加载信息,一切都很好!
问题: 不知怎的,一段时间后会发生什么,是否会被覆盖/丢失?在iPhone上进行测试时,我可以记录一下,然后几个小时后我会检查过去的游乐设施,然后乘车就在那里,但如果我记录了一个新的骑行,然后检查过去乘坐的车程几个小时前录制的消失了,但是新的骑行就在那里。
我称之为NSUserDefaults的唯一其他时间是在tableview中。我调用它的以下实例位于viewDidLoad:
中override func viewDidLoad() {
super.viewDidLoad()
// Set up an if statement so that if there is no saved content it does not throw an error, if there is, populate the information with rideContent, if not leave the list as empty
if NSUserDefaults.standardUserDefaults().objectForKey("rideContent") != nil {
// Save content of rideContent as permanent storage so the ride is saved even when the app has been closed, this restores the old data
rideContent = NSUserDefaults.standardUserDefaults().objectForKey("rideContent") as! [String]
}
}
如果用户滑动删除文件,我会调用它进一步向下:
// This method will be called when a user tries to delete an item in the table by swiping to the left
func tableView(tableView: UITableView, commitEditingStyle editingStyle: UITableViewCellEditingStyle, forRowAtIndexPath indexPath: NSIndexPath) {
// create an if statement to select the delete function after a user swipes to the left on a cell in the table
if editingStyle == UITableViewCellEditingStyle.Delete {
//Delete an item at the row index level
rideContent.removeAtIndex(indexPath.row)
// Update permanent storage after deleting a ride
NSUserDefaults.standardUserDefaults().setObject(rideContent, forKey: "rideContent")
// This is called so that when a file has been deleted, it will reload the view to reflect this change
savedRideTable.reloadData()
}
}
我想如果下面的代码看起来很正常,这是否意味着保存到用户文档并不能提供真正永久存储的文件?有没有更好的地方存储这些文件?我希望我不是太模糊,我很难找到应用程序执行此操作的原因,或者究竟是什么触发了这一点。谢谢stackExchange的帮助!
答案 0 :(得分:1)
这是NSUserDefaults
的正常行为。您没有保存txt文件,而是在String
中存储NSUserDefaults
,即使最终结果相似,这些也是两回事。
当你打电话:
NSUserDefaults.standardUserDefaults().setObject(rideContent, forKey: "rideContent")
第二次将上一个值替换为新值。
您有三种选择:
NSUserDefaults
类来存储这些字符串:您可以使用rideContent键保存包含所有乘坐数据的字符串数组。NSDocumentDirectory
内的真实txt文件:Read and write data from text file
https://developer.apple.com/library/ios/documentation/FileManagement/Conceptual/FileSystemProgrammingGuide/Introduction/Introduction.html CoreData
:
https://developer.apple.com/library/ios/documentation/DataManagement/Conceptual/CoreDataSnippets/Introduction/Introduction.html
https://www.raywenderlich.com/115695/getting-started-with-core-data-tutorial