Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/123.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 更新应用程序后在应用程序中添加新数据_Ios_Objective C_Tableview_Plist_Nsuserdefaults - Fatal编程技术网

Ios 更新应用程序后在应用程序中添加新数据

Ios 更新应用程序后在应用程序中添加新数据,ios,objective-c,tableview,plist,nsuserdefaults,Ios,Objective C,Tableview,Plist,Nsuserdefaults,我正在制作一个简单的三层应用程序,第一层和第二层都有桌面视图 TableView控制器中的行名称保存在plist文件的数组中。当用户重新排序行时,我只是将新的顺序保存为NSUserdDefaults对象中的新数组。每次加载tableview控制器时,我都会检查NSUserdDefaults对象是否为空。如果它不是空的,我从NSUserdDefaults中的数组中获取行顺序,否则–从plist文件 下面是一级tableview控制器的代码示例 - (void)viewDidLoad { [sup

我正在制作一个简单的三层应用程序,第一层和第二层都有桌面视图

TableView控制器中的行名称保存在plist文件的数组中。当用户重新排序行时,我只是将新的顺序保存为
NSUserdDefaults
对象中的新数组。每次加载tableview控制器时,我都会检查
NSUserdDefaults
对象是否为空。如果它不是空的,我从
NSUserdDefaults
中的数组中获取行顺序,否则–从plist文件

下面是一级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
对象,但我找不到如何在更新之后进行,也没有更多的时间

你对如何处理这件事有什么想法吗


非常感谢您提供的任何帮助

您可以这样说:

  • 在NSUserDefaults内部保留一个版本号-它将始终是捆绑版本
  • 加载应用程序时,检查版本是否低于当前捆绑包版本-对数据进行更新,并将版本号更新为捆绑包版本,以便只执行一次
  • 如果您添加了新属性,只需检查它们是否已经在NSUSerDefaults上,如果没有,则在转换逻辑中创建它们
  • 请记住,您必须准备从任何版本到任何版本的转换逻辑-如果用户跳过了中间的某个版本,您的逻辑将仅在最终版本上运行

    ============================

    评论中对您的问题的额外回答:

    1) “捆绑版本”是什么意思

    NSString*版本=[[NSBundle mainBundle]信息字典]objectForKey:@“CbundLeverVersion”]

    这是应用程序的版本-每次将应用程序推送到苹果商店时,您都需要增加它。您可以在xcode项目设置中执行此操作

    2) 我如何检查更新的发生-我的意思是,我如何知道我需要增加版本号

    您无法检测更新进程本身并对其作出反应。您必须在应用程序启动时进行检查。当您的应用程序启动时,在向用户显示任何内容之前,请检查从bundle(如上答案)到[NSUserDefaults]中的任何内容的“版本”。如果它与您知道的不同,则应用程序已更新,并且您有新的应用程序版本使用旧的数据版本。基于此,您可以做出反应并将数据+更新版本更新为当前构建版本

    3) “新属性”-您是指将保存在NSUserDefaults中但以前未保存的一些额外数据?例如,在版本2中,我将开始保存行的数量,并且还没有更新到版本2的用户,但是更新到版本3的用户将没有该对象。因此,我需要检查是否存在所有NSUserDefaults对象,如果不存在,则创建它们。对吧?


    对。在转换代码中,当您检测到应用程序的版本与保存的数据的版本不同后,请检查变量是否存在-如果不存在,则必须创建变量并为其指定默认值。

    谢谢!我理解其中的逻辑,我可以问一些额外的问题吗(我是iOS新手):当然可以给我写封信,如果问题比较大,可以在单独的问题中发帖。谢谢。1) “bundle version”是什么意思2)我如何检查更新发生了-我的意思是,我如何知道我需要增加版本号。3) “新属性”-您是指将保存在NSUserDefaults中但以前未保存的一些额外数据?例如,在版本2中,我将开始保存行的数量,并且还没有更新到版本2的用户,但是更新到版本3的用户将没有该对象。因此,我需要检查是否存在所有NSUserDefaults对象,如果不存在,则创建它们。正确的?