2017-02-24 8 views
0

Objective C에서 iOS 앱을 코딩하고 있습니다. 사용자가 앱을 열 때 이용 약관이 표시되기를 원합니다. NSUserDefaults를 사용하여 모두 알아 낸 "다시 표시하지 않음"버튼을 갖게 될 것입니다. 내가 알아낼 수없는 것은 사용자가 "동의 함"(termsPressed)을 누르지 만 "다시 표시하지 않음"(neverAgainPressed)으로 설정하면 용어 및 조건을 사라지게 만드는 방법입니다. 나는 button.hidden을 사용하여 그것들을 숨길 수있다. 그러나 사용자가 앱의 메인 화면으로 돌아 오자마자, 앱이 처음 시작했을 때처럼 메인 화면을 오버레이하여 이용 약관이 다시 나타난다.iOS 앱이 실행중인 전체 시간 동안 버튼, 라벨 등을 숨기는 방법. 시작시 다시 표시 하시겠습니까?

"동의 함"을 누를 때 NSUserDefault를 설정하고 -applicationWillTerminate가 호출 될 때 NSUserDefault를 설정해 보았습니다.하지만 백그라운드에서 닫힌 경우 응용 프로그램이 종료 될 때 applicationWillTerminate가 안정적으로 호출되지 않는 것으로 보입니다. 사용자가 '다시 표시하지 않음'을 누르지 않았더라도 사용자는 용어를 다시 볼 수 없습니다. 응용 프로그램이 종료 할 때마다 불렀다 방법, 또는 응용 프로그램이 실행되는 전체 시간을 지속 .hidden의 버전이 있다면

- (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 

, 나는 모든 세트 것 : 여기 내 코드입니다. 너희들에게 아이디어가 있다면 알려줘.

+0

에서 : 당신은 (예 : 30 일) 처음 실행에서 일부 시간이 지나면 보일 수 있는가? appWillTerminate 메서드는 응용 프로그램을 닫을 때 호출되므로 다시 시작할 때마다 응용 프로그램에 false 값이 표시되므로 항상 표시됩니다. – Calc91

+0

applicationWillTerminate에서 코드를 제거한 다음 다시 시도하십시오. –

+0

applicationWillTerminate 이후에 코드를 재설정하는 이유는 사용자가 이전에 "다시 표시하지 않음"을 클릭하지 않으면 응용 프로그램이 열릴 때마다 나타나는 용어를 표시하기 위해서입니다. terms 앱이 처음 열릴 때 false가되어야하지만 "accept terms"을 누른 후 앱이 열려있는 동안은 true이어야합니다. applicationWillTerminiate에서 코드를 제거해도 아무 것도하지 않습니다. 앱이 닫을 때마다 메소드가 트리거되지 않는 것 같아 코드가 카운터를 FALSE로 안정적으로 재설정하지 않습니다. – Nate

답변

0

"다시 표시하지 않음"을 원하면 왜 재설정합니까?

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 
} 

또는 레서 드 응용 프로그램이 종료됩니다 때 termsPressed false로 설정하는 이유는

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

감사합니다. 이 두 번째 옵션은 내가 찾고 있었던 것입니다. – Nate