仅当应用程序更新时重置特定的 NSUserDefaults 键

发布于 2024-12-27 02:22:45 字数 4640 浏览 1 评论 0原文

我有两个 NSUserDefaults 键:第一个是与显示一个小介绍窗口相关的键,第二个是与更改前 3 个会话的 tableView 中的单元格背景颜色相关的键。

现在,当我更新我的应用程序时,我希望重置第二个键,以便为前 3 个会话显示不同的单元格背景颜色。

这是我在应用程序委托中的代码:(

[[NSUserDefaults standardUserDefaults] setObject: @"1.3.5" forKey:@"lastVer"];//in memory
    NSString *lastVersion = [[NSUserDefaults standardUserDefaults] objectForKey:@"lastVer"];
    NSString *version = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleVersion"];

    NSLog(@"**** Version: %@",version);

    NSNumber *runNumber = [[NSUserDefaults standardUserDefaults] objectForKey:@"runNum"]; 
   if(![lastVersion isEqualToString: version]){
        NSNumber *runNumber = [NSNumber numberWithInt:0]; 
        [[NSUserDefaults standardUserDefaults] setObject:runNumber forKey:@"runNum"]; 
    }
    else { 
        [[NSUserDefaults standardUserDefaults] setObject:[NSNumber numberWithInt:([runNumber intValue] + 1)] forKey:@"runNum"]; 
        NSLog(@"This is Run Number: %d", [runNumber intValue]);    
    }

    if (runNumber == [NSNumber numberWithInt:0]){
       [[NSUserDefaults standardUserDefaults] setObject:[NSNumber numberWithInt:([runNumber intValue] + 1)] forKey:@"runNum"]; 
        NSLog(@"Run number: %d", [runNumber intValue]);    
    }

注意:runNumber 是存储 3 个会话的单元格背景颜色的键)

它检查 lastVersion 是否等于捆绑包版本,并重置 runNum 的键(为其提供值) 0)。然后,如果 runNum 为 0,则增加 runNumbers。

但有一个问题!

当lastVersion与版本不同时,它会重置密钥,但我不知道如何再次增加runNum,而无需再次重置运行次数,因为每次打开应用程序时runNum都会被重置!

lastVersion = 1.3.4
version = 1.3.5
if lastVersion is different from version, then runNum == 0
and if runNum == 0, runNum = runNum + 1
//CLOSING AND REOPENING THE APP
runNum = 0 
runNum = runNum +1
//CLOSING AND REOPENING THE APP
runNum = 0
runNum = runNum + 1
//and so on..

当我关闭并重新打开应用程序时,runNum 键再次变为 0!

如何仅重置 runNum 键一次,然后再次增加它?

编辑

我做了以下更改:

NSString *lastVersion = [[NSUserDefaults standardUserDefaults] objectForKey:@"lastVer"]; 

    // get the current bundle version. 
    NSString *currentVersion = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleVersion"]; 


    NSLog(@"Last Version: %@, New Version: %@", lastVersion, currentVersion); 

    NSNumber *runNumber = [[NSUserDefaults standardUserDefaults] objectForKey:@"runNum"]; 
    NSInteger runNumberValue = [runNumber integerValue]; 


    if(![lastVersion isEqualToString: currentVersion]){ 
        NSLog(@"Last Version and Version are not same."); 
        NSNumber *runNumber = [NSNumber numberWithInt:0]; 
        [[NSUserDefaults standardUserDefaults] setObject:runNumber forKey:@"runNum"]; 
        [[NSUserDefaults standardUserDefaults] setObject:currentVersion forKey:@"lastVer"]; 
        NSLog(@"last Version is: %@",lastVersion);

    } 
    else { 
        NSLog(@"Last Version and Version are same."); 
        NSInteger newRunNumberValue = runNumberValue++; 
        if(newRunNumberValue > 2) { 
            newRunNumberValue = 0; 
        } 
        [[NSUserDefaults standardUserDefaults] setObject:[NSNumber numberWithInt:newRunNumberValue] forKey:@"runNum"]; 
    }

这是在前 3 个会话中使单元格背景发生变化的代码:

    NSString *lastVersion = [[NSUserDefaults standardUserDefaults] objectForKey:@"lastVer"]; 

// get the current bundle version. 
NSString *currentVersion = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleVersion"]; 

NSLog(@"Last Version: %@, New Version: %@", lastVersion, currentVersion); 

NSNumber *runNumber = [[NSUserDefaults standardUserDefaults] objectForKey:@"runNum"]; 

if (!runNumber) { 
    NSLog(@"**** Resetting Run Number to zero ****"); 
    NSNumber *runNumber = [NSNumber numberWithInt:0]; 
    [[NSUserDefaults standardUserDefaults] setObject:runNumber forKey:@"runNum"]; 
} else { 
    [[NSUserDefaults standardUserDefaults] setObject:[NSNumber numberWithInt:([runNumber intValue] + 1)] forKey:@"runNum"]; 
    NSLog(@"This is Run Number: %d", [runNumber intValue]); 
} 


if(![lastVersion isEqualToString: currentVersion]){ 
    NSLog(@"Last Version and Version are not same."); 
    [[NSUserDefaults standardUserDefaults] setObject:currentVersion forKey:@"lastVer"]; 
    NSLog(@"last Version is: %@",lastVersion);
    //What should i do here to make the updated app show the different cells background?
} 
else { 
    NSLog(@"Last Version and Version are same."); 
    //What should i do here to make the updated app show the different cells background?
}

现在:当用户下载应用程序时,如何使应用程序显示不同的单元格背景第一次(3 个会话)以及用户更新应用程序时(即使在 N 个会话之后)?我被困在这里了。

有什么想法吗?

I have two NSUserDefaults keys: the first is the one related to show a little intro window, the second is the one related to change the cells background color in my tableView for the first 3 sessions.

Now, when i update my app, i want the second key to reset, in order to show a different cells background color for the first 3 sessions.

This is my code in my app delegate:

[[NSUserDefaults standardUserDefaults] setObject: @"1.3.5" forKey:@"lastVer"];//in memory
    NSString *lastVersion = [[NSUserDefaults standardUserDefaults] objectForKey:@"lastVer"];
    NSString *version = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleVersion"];

    NSLog(@"**** Version: %@",version);

    NSNumber *runNumber = [[NSUserDefaults standardUserDefaults] objectForKey:@"runNum"]; 
   if(![lastVersion isEqualToString: version]){
        NSNumber *runNumber = [NSNumber numberWithInt:0]; 
        [[NSUserDefaults standardUserDefaults] setObject:runNumber forKey:@"runNum"]; 
    }
    else { 
        [[NSUserDefaults standardUserDefaults] setObject:[NSNumber numberWithInt:([runNumber intValue] + 1)] forKey:@"runNum"]; 
        NSLog(@"This is Run Number: %d", [runNumber intValue]);    
    }

    if (runNumber == [NSNumber numberWithInt:0]){
       [[NSUserDefaults standardUserDefaults] setObject:[NSNumber numberWithInt:([runNumber intValue] + 1)] forKey:@"runNum"]; 
        NSLog(@"Run number: %d", [runNumber intValue]);    
    }

(Note: the runNumber is the key that stores the cells background color for 3 sessions)

it checks if the lastVersion is equal to the bundle version and it resets the key for runNum (giving it the value 0). Then, if the runNum is 0, it increase the runNumbers.

But there's a problem!

When the lastVersion is different from version, it resets the key, but i don't know how to increment runNum again, without resetting again the number of the runs, because runNum is being reset everytime i open the app!

i.e.

lastVersion = 1.3.4
version = 1.3.5
if lastVersion is different from version, then runNum == 0
and if runNum == 0, runNum = runNum + 1
//CLOSING AND REOPENING THE APP
runNum = 0 
runNum = runNum +1
//CLOSING AND REOPENING THE APP
runNum = 0
runNum = runNum + 1
//and so on..

When i close and reopen the app, the runNum key is 0 again!

How can i reset the runNum key ONLY one time and then increment it again?

EDIT

I made the following changes:

NSString *lastVersion = [[NSUserDefaults standardUserDefaults] objectForKey:@"lastVer"]; 

    // get the current bundle version. 
    NSString *currentVersion = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleVersion"]; 


    NSLog(@"Last Version: %@, New Version: %@", lastVersion, currentVersion); 

    NSNumber *runNumber = [[NSUserDefaults standardUserDefaults] objectForKey:@"runNum"]; 
    NSInteger runNumberValue = [runNumber integerValue]; 


    if(![lastVersion isEqualToString: currentVersion]){ 
        NSLog(@"Last Version and Version are not same."); 
        NSNumber *runNumber = [NSNumber numberWithInt:0]; 
        [[NSUserDefaults standardUserDefaults] setObject:runNumber forKey:@"runNum"]; 
        [[NSUserDefaults standardUserDefaults] setObject:currentVersion forKey:@"lastVer"]; 
        NSLog(@"last Version is: %@",lastVersion);

    } 
    else { 
        NSLog(@"Last Version and Version are same."); 
        NSInteger newRunNumberValue = runNumberValue++; 
        if(newRunNumberValue > 2) { 
            newRunNumberValue = 0; 
        } 
        [[NSUserDefaults standardUserDefaults] setObject:[NSNumber numberWithInt:newRunNumberValue] forKey:@"runNum"]; 
    }

And this is the code that makes the cells background change on the first 3 sessions:

    NSString *lastVersion = [[NSUserDefaults standardUserDefaults] objectForKey:@"lastVer"]; 

// get the current bundle version. 
NSString *currentVersion = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleVersion"]; 

NSLog(@"Last Version: %@, New Version: %@", lastVersion, currentVersion); 

NSNumber *runNumber = [[NSUserDefaults standardUserDefaults] objectForKey:@"runNum"]; 

if (!runNumber) { 
    NSLog(@"**** Resetting Run Number to zero ****"); 
    NSNumber *runNumber = [NSNumber numberWithInt:0]; 
    [[NSUserDefaults standardUserDefaults] setObject:runNumber forKey:@"runNum"]; 
} else { 
    [[NSUserDefaults standardUserDefaults] setObject:[NSNumber numberWithInt:([runNumber intValue] + 1)] forKey:@"runNum"]; 
    NSLog(@"This is Run Number: %d", [runNumber intValue]); 
} 


if(![lastVersion isEqualToString: currentVersion]){ 
    NSLog(@"Last Version and Version are not same."); 
    [[NSUserDefaults standardUserDefaults] setObject:currentVersion forKey:@"lastVer"]; 
    NSLog(@"last Version is: %@",lastVersion);
    //What should i do here to make the updated app show the different cells background?
} 
else { 
    NSLog(@"Last Version and Version are same."); 
    //What should i do here to make the updated app show the different cells background?
}

Now: how can i make the app show the different cells background when the user downloads it for the first time (3 sessions) and when the user updates the app (even after N sessions)? I'm stuck here.

Any ideas?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

青巷忧颜 2025-01-03 02:22:45

我自己解决了!

 if(![lastVersion isEqualToString: currentVersion]){ 
        NSLog(@"Last Version and Version are not same."); 
        [[NSUserDefaults standardUserDefaults] setObject:currentVersion forKey:@"lastVer"]; 
        NSLog(@"last Version is: %@",lastVersion);
        NSNumber *runNumber = [NSNumber numberWithInt:0]; 
        [[NSUserDefaults standardUserDefaults] setObject:runNumber forKey:@"runNum"]; 
        NSLog(@"runNumber is: %d",[runNumber intValue]);

    } 
    else { 
        NSLog(@"Last Version and Version are same."); 
        [[NSUserDefaults standardUserDefaults] setObject:[NSNumber numberWithInt:([runNumber intValue] + 1)] forKey:@"runNum"]; 
        NSLog(@" Run Number: %d", [runNumber intValue]);    
    }

I solved it myself!

 if(![lastVersion isEqualToString: currentVersion]){ 
        NSLog(@"Last Version and Version are not same."); 
        [[NSUserDefaults standardUserDefaults] setObject:currentVersion forKey:@"lastVer"]; 
        NSLog(@"last Version is: %@",lastVersion);
        NSNumber *runNumber = [NSNumber numberWithInt:0]; 
        [[NSUserDefaults standardUserDefaults] setObject:runNumber forKey:@"runNum"]; 
        NSLog(@"runNumber is: %d",[runNumber intValue]);

    } 
    else { 
        NSLog(@"Last Version and Version are same."); 
        [[NSUserDefaults standardUserDefaults] setObject:[NSNumber numberWithInt:([runNumber intValue] + 1)] forKey:@"runNum"]; 
        NSLog(@" Run Number: %d", [runNumber intValue]);    
    }
暗恋未遂 2025-01-03 02:22:45

当上一个版本与当前版本不相等时,您应该重置运行号。这将是新版本首次运行时的情况。因此,在将用户默认值更新为捆绑包中的版本号之前,请重置此时的运行号。

You should reset the run number when the last version is not equal to the current version. This will be at the first run of your new version. So, before you update user defaults to the version number from your bundle, reset the run number at that point.

蓝咒 2025-01-03 02:22:45

虽然你的问题不是很清楚,但我只是尽力根据我能理解的内容提供帮助。请编辑您的问题,以便更清楚地描述您的问题。

您可以记录您的 NSString *version 的值吗?

即紧接着:

NSString *version = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleVersion"];

put a

NSLog(@"version %@", version);

这应该确保你的是否

if([lastVersion isEqualToString: version]){ 
...
}

被执行。

此外,您不必简单地从 NSUserDefaults 中删除密钥来更新它。您可以安全地从代码中删除这一行:

[[NSUserDefaults standardUserDefaults] removeObjectForKey:@"runNum"];

只需进行这些更改,然后让我知道它是否有效。

Although your question is not very clear, I'm just trying to help based on what I could understand. Please edit your question so as to describe your issue more clearly.

Can you log the value of your NSString *version.

i.e just after:

NSString *version = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleVersion"];

put a

NSLog(@"version %@", version);

This should ensure whether your

if([lastVersion isEqualToString: version]){ 
...
}

is executed or not.

Moreover you don't have to remove a key from NSUserDefaults simply to update it. You can safely remove this line from your code:

[[NSUserDefaults standardUserDefaults] removeObjectForKey:@"runNum"];

Just make these changes and let me know if it works.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文