我正在制作一个简单的3级应用程序,其中包含1级和2级的表格视图。
tableviews控制器中行的名称保存在plist文件的数组中。当用户重新排序行时,我只是将新订单保存为NSUserdDefaults
对象中的新数组。每次加载tableview控制器时,我都会检查NSUserdDefaults
对象是否为空。如果它不为空,我从NSUserdDefaults
中的数组中获取行顺序,否则 - 从plist文件中获取。
以下是第1级tableview控制器的代码示例
- (void)viewDidLoad {
[super viewDidLoad];
self.title = @"Topics";
// Checking User changes
NSMutableArray* sectionList = [NSMutableArray arrayWithArray:[[NSUserDefaults standardUserDefaults] objectForKey:@"section"]];
if ([sectionList count] != 0) {
self.sections = [[NSMutableArray alloc] initWithArray:sectionList copyItems:YES];}
else {
NSString *filePath = [[NSBundle mainBundle] pathForResource:@"myFile" ofType:@"plist"];
self.sections = [NSMutableArray arrayWithContentsOfFile:filePath];}
- (void)tableView:(UITableView *)tableView moveRowAtIndexPath:(NSIndexPath *)fromIndexPath toIndexPath:(NSIndexPath *)toIndexPath{
NSString *item = [self.sections objectAtIndex:fromIndexPath.row];
[self.sections removeObject:item];
[self.sections insertObject:item atIndex:toIndexPath.row];
[[NSUserDefaults standardUserDefaults] setObject:self.sections forKey:@"section"];}
问题在于更新。如果我在plist文件和更新应用程序中添加一些新数据(新行),用户将无法在tableview控制器中看到新行,因为他的NSUserdDefaults
对象不为空,并且将从该对象加载行名称和顺序。我正在考虑清除NSUserdDefaults
个对象,但是在更新之后我再也找不到如何做到这一点。
您有什么想法如何解决这个问题吗?
非常感谢任何帮助
答案 0 :(得分:1)
你可以这样方式:
请记住,您必须准备适用于任何版本的转换逻辑 - 如果用户跳过某些版本,您的逻辑将只运行最终版本的版本。
============================
评论中您的问题的额外答案:
1)它是什么意思“捆绑版本”
NSString * version = [[[NSBundle mainBundle] infoDictionary] objectForKey:@“CFBundleVersion”];
这是应用程序的版本 - 每次将应用程序推送到Apple Store时都需要增加它。您可以在xcode项目设置中执行此操作。
2)我如何检查更新是否发生 - 我的意思是,我怎么知道我需要增加版本号。
您无法检测更新过程本身并对其做出反应。您必须在应用程序启动时检查它。当您的应用程序启动时,在向用户显示任何内容之前,请检查捆绑包中的“版本”(如上所述)以及[NSUserDefaults]中的任何内容。如果它与您知道应用程序已更新并且您的新应用程序版本使用旧数据版本不同。基于此,您可以对数据+更新版本做出反应并将其更新为当前版本。
3)“新属性” - 你的意思是一些额外的数据将保存在NSUserDefaults中,但之前没有保存过?例如,在版本2中,我将开始保存行数和未更新到第2版的用户,但是对版本3的更新将不具有该对象。所以我需要检查是否存在所有NSUserDefaults对象,如果不存在 - 创建它们。正确?
没错。在您的转换代码中,在您检测到该版本的应用程序与已保存数据的版本不同之后,您将检查是否存在变量 - 如果不是,则必须创建它并为其指定默认值。