IF语句未在首次运行时检查条件

时间:2011-07-06 02:44:34

标签: iphone objective-c xcode cocoa-touch

我是编程新手,我有一个启动时具有登录视图的应用程序,并要求用户输入他们在整个程序中使用的名称。一旦他们输入他们的名字并登录,他们就会看到主菜单视图。他们的名字是使用NSUserdefaults保存的。

他们的想法是,他们只需要登录一次(或者如果他们退出则再次登录),这样他们只应该在第一次运行应用程序时看到登录视图,但是一旦应用程序再次启动,它仍会显示登录屏幕,您也必须先按两次登录按钮才能进入主菜单。

我知道该应用程序正在存储详细信息,因为它被用于考虑应用程序,但我无法解决原因。这是我的代码。如果有人能提供帮助,我们将不胜感激。

-(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];
     }
}

2 个答案:

答案 0 :(得分: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];
}

可以做很多事情来整理这个问题,但这应该是让你前进的开始。

关于你的命名的提醒。惯例是使用小写字母启动方法和变量名称。类和常量以大写字母开头。

答案 1 :(得分:0)

这似乎是第一次:

  • 登录屏幕显示
  • 用户按下登录(您正在显示的此方法被调用)
  • 最初未设置保存的值,因此评估为true:if(tempStr.length==0)
  • 您保存新值
  • 您显示另一个登录屏幕

但我认为你没有显示所有代码。应用程序启动时会运行什么?