2011-07-06 59 views
2

我是新手編程人員,我有一個應用程序,它具有啓動時的登錄視圖並請求用戶輸入他們的名字,這個名字在程序中使用。一旦他們輸入他們的名字並登錄,他們就會看到主菜單視圖。他們的名字使用NSUserdefaults保存。IF statment not checking condition on first run

的想法是,他們將只需要登錄一次(或再次,如果他們退出),因此他們應該只看到登錄查看它們運行然而,一旦應用程序被再次啓動的應用程序在第一時間它仍然顯示登錄屏幕並且在進入主菜單之前還必須按兩下登錄按鈕。

我知道該應用程序正在存儲的細節,因爲它被認爲是應用程序,但我無法找出原因。這是我的代碼。如果有人可以幫助它將不勝感激。

-(IBAction)LogInButton:(id)sender 
{ 
    NSString *tempStr = [[NSUserDefaults standardUserDefaults] objectForKey:@"UserName"]; 

    if(tempStr.length==0) 
    { 
      NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults]; 
      [prefs setObject:Name.text forKey:@"UserName"]; 
      [prefs synchronize]; 

      LogInView *Logview = [[LogInView alloc] initWithNibName:@"LogInView" bundle:nil]; 
      [self presentModalViewController:Logview animated:YES]; 
    } 
    else 
    { 
      MainMenuView *mainview = [[MainMenuView alloc] initWithNibName:@"MainMenuView"  bundle:nil]; 
      [self presentModalViewController:mainview animated:YES]; 
    } 
} 

回答

0

它看起來像第一次:

  • 登錄屏幕上顯示出來
  • 用戶按下登錄(這方法,你正在展示被調用)
  • 保存值沒有初始設置,因此該評估爲真:if(tempStr.length==0)
  • 您保存新值
  • 您顯示另一個登錄屏幕

但我不認爲你顯示所有的代碼。應用程序啓動時運行的是什麼?

+0

感謝您的回覆,但抱歉,我不明白您需要什麼。你需要看到什麼代碼部分,即appdelegate.m等@史蒂夫 – Wayne

+0

是的,我不知道你的文件名是什麼,但無論代碼最初決定「我顯示登錄屏幕,還是跳過它並顯示主菜單「? – Steve

+0

我想也許這個代碼:} - (void)LogInSuccess { \t [self.navigationController popViewControllerAnimated:YES]; MainMenuView * mainview = [[MainMenuView alloc] initWithNibName:@「MainMenuView」bundle:nil];}} \t [self.navigationController pushViewController:(UIViewController *)mainview animated:YES]; \t \t [window addSubview:navigationController.view]; \t [window makeKeyAndVisible]; } – Wayne

3

通過你的描述來看,你想要的是

  • viewDidLoad檢查,以查看用戶是否在
    • 記錄如果是顯示MainMenu
    • 如果不顯示的LogInView

該代碼可能看起來像這樣

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 

    [self showCorrectController]; 
} 

展示正確的控制器方法可能看起來像這樣

- (void)showCorrectController 
{ 
    UIViewController *viewController = nil; 

    if ([self isLoggedIn]) { 
    viewController = [[MainMenuView alloc] init]; 
    } else { 
    viewController = [[LogInView alloc] init]; 
    } 

    [self presentModalViewController:viewController animated:YES]; 
    [viewController release]; viewController = nil; 
} 

的一種簡便方法被稱爲isLoggedIn它看起來像這樣

- (BOOL)isLoggedIn 
{ 
    // The double negation just means we get a boolean response 
    return !![[NSUserDefaults standardUserDefaults] objectForKey:@"UserName"]; 
} 

現在編輯你原來的方法是這樣的

-(IBAction)LogInButton:(id)sender 
{ 
    NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults]; 
    [prefs setObject:Name.text forKey:@"UserName"]; 
    [prefs synchronize]; 
    [self showCorrectController]; 
} 

有很多事情可以做到整理這很多,但這應該是一個開始讓你去。

對事物的命名謹慎。約定是用小寫字母開始方法和變量名稱。類和常量以大寫字母開頭。

+0

+1更好。 – Steve

+0

嗨保羅。感謝帖子,但你能幫忙嗎?我遵循了你的指示,但我一定是在做錯什麼。該應用程序運行,但沒有登錄就進入主菜單,我也有以下警告。 '...可能不會響應correctController'和'...可能不會響應isLoggedIn'。也許我把一些東西放在錯誤的文件中@ Paul.s – Wayne

+0

您需要在@interface中添加方法定義。有些方法可以添加這些定義,以便它們不會混淆您的公共API,但可以開始將它們放入您的.h文件中,像這樣。 ' - (void)showCorrectController;'' - (BOOL)isLoggedIn;'添加下面你看到寫的內容 - (IBAction)LogInButton:(id)sender'。如果它直接進入'MainMenuController',那麼這就意味着有一些東西存儲在'@「UserName」'下面。通過打印到控制檯'NSLog(@「%@」,[[NSUserDefaults standardUserDefaults] objectForKey:@「UserName」]); –