【问题标题】:How to hide buttons, labels, etc for entire time iOS app is running, then show them again at start?如何在整个 iOS 应用程序运行期间隐藏按钮、标签等,然后在启动时再次显示它们?
【发布时间】:2026-02-02 06:05:01
【问题描述】:

我正在使用 Objective C 编写 iOS 应用程序。我希望在用户打开应用程序时显示条款和条件。我将有一个“不再显示这些”按钮,这都是使用 NSUserDefaults 计算出来的。我想不通的是,如果用户点击“同意”(termsPressed)而不是“不再显示这些”(neverAgainPressed),如何使条款和条件消失。我可以使用 button.hidden 隐藏它们,但是一旦用户返回应用程序的主屏幕,条款和条件就会再次出现,就像应用程序首次启动时一样覆盖主屏幕。

我尝试在按下“同意”时设置 NSUserDefault,然后在调用 -applicationWillTerminate 时将其重置,但如果应用程序从后台关闭,则应用程序关闭时似乎不会可靠地调用 applicationWillTerminate,因此用户即使他们没有点击“不再显示这些”,也永远不会再看到这些条款。这是我的代码:

- (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 版本在应用运行的整个过程中都持续存在,那么我就准备好了。如果你们有任何想法,请告诉我。

【问题讨论】:

  • 当 de app 终止时,为什么要为 termsPressed 设置 false?关闭应用程序时会调用 applicationWillTerminate 方法,因此每次再次启动时,应用程序的值都会为 false,这就是为什么总是显示的原因。
  • 从 applicationWillTerminate 中删除代码,然后重试。
  • 我在 applicationWillTerminate 之后重置代码的原因是我希望每次打开应用程序时都显示这些术语,除非用户之前单击了“不再显示”。最初打开应用程序时,termsPressed 应该为 false,但在应用程序按“接受条款”后打开应用程序的整个过程中为 true。删除 applicationWillTerminate 中的代码不会做任何事情 - 就目前而言,代码不会可靠地将计数器重置为 FALSE,因为每次应用关闭时似乎都不会触发该方法。

标签: ios objective-c hide


【解决方案1】:

如果您想“不再显示这些”,为什么要重置?您可以在首次发布时和一段时间后(例如 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;
}

【讨论】:

  • 谢谢!第二个选项正是我想要的