如何在整个时间 iOS 应用程序 运行 中隐藏按钮、标签等,然后在开始时再次显示它们?

How to hide buttons, labels, etc for entire time iOS app is running, then show them again at start?

我正在 Objective C 中编写 iOS 应用程序。我希望条款和条件在用户打开应用程序时出现。我将有一个 "don't show these again" 按钮,这都是使用 NSUserDefaults 计算出来的。我想不通的是,如果用户点击 "agree"(termsPressed)而不是 "don't show these again"(neverAgainPressed),如何使条款和条件消失。我可以使用 button.hidden 隐藏它们,但是一旦用户 returns 进入应用程序的主屏幕,条款和条件就会再次出现,覆盖主屏幕,就像应用程序首次启动时一样.

我试过在按下 "agree" 时设置一个 NSUserDefault,然后在调用 -applicationWillTerminate 时重置它,但如果应用程序从后台关闭,则在应用程序关闭时似乎无法可靠地调用 applicationWillTerminate,因此,即使他们没有点击 "don't show these again",用户也永远不会再看到这些条款。这是我的代码:

- (void)viewDidLoad {
    // Hide all the terms and conditions elements if either "neverAgain" or "termsPressed" is true
    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
    BOOL neverAgain = [defaults boolForKey:@"neverAgain"];
    if (neverAgain == TRUE){
        _terms.hidden=YES;
        _hideTerms.hidden=YES;
        _background.hidden=YES;
        _dontShow.hidden=YES;
    }
    BOOL termsPressed = [defaults boolForKey:@"termsPressed"];
    if (termsPressed == TRUE){
        _terms.hidden=YES;
        _hideTerms.hidden=YES;
        _background.hidden=YES;
        _dontShow.hidden=YES;
    }

    NSLog(@"View loaded. termsPressed = %i", termsPressed);
    NSLog(@"View loaded. neverAgain = %i", neverAgain);

    [super viewDidLoad];
}

- (IBAction)neverAgainPressed:(id)sender {
    BOOL neverAgain = TRUE;
    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
    [defaults setBool:neverAgain forKey:@"neverAgain"];
    [defaults synchronize];

    NSLog(@"Don't show terms again pressed, neverAgain set to TRUE");
}

- (IBAction)termsPressed:(id)sender {
    _terms.hidden = YES;
    _hideTerms.hidden = YES;
    _background.hidden = YES;
    _dontShow.hidden = YES;
    BOOL termsPressed = TRUE;
    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
    [defaults setBool:termsPressed forKey:@"termsPressed"];
    [defaults synchronize];

    NSLog(@"Terms accepted, termsPressed set to TRUE");
}

 - (void)applicationWillTerminate:(UIApplication *)application {
    BOOL termsPressed = FALSE;
    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
    [defaults setBool:termsPressed forKey:@"termsPressed"];
    [defaults synchronize];

    NSLog(@"Application entering background, termsPressed reset to FALSE");
}
@end

如果每次应用程序退出时都会调用一个方法,或者在整个应用程序 运行 期间持续存在的 .hidden 版本,我就已经准备好了。如果你们有任何想法,请告诉我。

如果你想要"don't show these again",为什么要重置?您可以在首次发布时和一段时间后(例如 30 天)显示:

    BOOL ranBefore = [[NSUserDefaults standardUserDefaults] boolForKey:@"kRanBefore"];

    NSDate *lastDate = [[NSUserDefaults standardUserDefaults] objectForKey:@"kLastCloseDate"];
    NSTimeInterval timeDiff = [[NSDate date] timeIntervalSinceDate:lastDate];
    int days = timeDiff / 86400;

    if ((!ranBefore) || (days > 30)) {

        [[NSUserDefaults standardUserDefaults] setBool:YES forKey:@"kRanBefore"];
        [[NSUserDefaults standardUserDefaults] synchronize];
        [[NSUserDefaults standardUserDefaults] setObject:[NSDate date] forKey:@"kLastCloseDate"];

... show something
}

或预约

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    // Override point for customization after application launch.
    return YES;
}