【问题标题】:View controller won't return to previous view controller programmatically视图控制器不会以编程方式返回到以前的视图控制器
【发布时间】:2014-11-17 16:41:20
【问题描述】:

场景是当应用程序第一次加载(控制器 A 加载)时,它会检查 NSDefaultuser 是否存在。如果它不存在,则将其发送到(控制器 B)。在控制器 B 中,用户输入他/她的用户名,然后单击确定。现在,NSDefault 正在保存用户名,它还应该将其重定向回主视图控制器。代码如下:

if([Username.text  isEqual: @""]) {
    [self showOkAlert:@"Username required"];
}
else if([Password.text isEqual:@""]) {
    [self showOkAlert:@"Password required"];
}
else  {
    //suppose that login was successfully.
    [self SaveCredentials];


    NSString * storyboardName = @"MainStoryboard";
    UIStoryboard *storyboard = [UIStoryboard storyboardWithName:storyboardName bundle: nil];
    UIViewController * vc = [storyboard instantiateViewControllerWithIdentifier:@"LatestNews"];
    [self presentViewController:vc animated:YES completion:nil];

}

控制器 A:

- (void)LoadCredentials {
//load username
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
NSString *username = [defaults objectForKey:@"User"];

if(!username) {

    [self showAlert:@"user does not exist"];

    [self dismissViewControllerAnimated:YES completion:nil];

    NSString * storyboardName = @"MainStoryboard";
    UIStoryboard *storyboard = [UIStoryboard storyboardWithName:storyboardName bundle: nil];
    UIViewController * vc = [storyboard instantiateViewControllerWithIdentifier:@"Login"];
    [self presentViewController:vc animated:YES completion:nil];

}else{
    [self showAlert:@"user exists"]; 
    // for testing purposes I want it to reset when user logged in. Just so I know it resets. Later this method will be called from logout button.
    [self resetUsernameWhenLogout];       
}
}
-(void)resetUsernameWhenLogout {
//reset username when logout
NSDictionary *defaultsDictionary = [[NSUserDefaults standardUserDefaults]     dictionaryRepresentation];
for (NSString *key in [defaultsDictionary allKeys]) {
    [[NSUserDefaults standardUserDefaults] removeObjectForKey:key];
}
[[NSUserDefaults standardUserDefaults] synchronize];
}

- (void)viewDidLoad
{
    [self LoadCredentials];
}

【问题讨论】:

  • 线程错误?你能先检查 [NSThread isMainThread] 的值吗?如果它是错误的,那么您正在某处创建一个线程并尝试在非主线程中使用 UIKit 将无法正常工作,或者更糟的是部分工作。 (顺便说一句,在用户默认值中保存密码一点都不好,你应该使用钥匙串,也许用包装器github.com/soffes/sskeychain
  • 无论我尝试什么都不会让我回头。任何想法为什么?
  • 我没有保存密码只是用户名。
  • 线程 1:断点 3.1 这就是我得到的。这并不是真正的错误,它只是从模拟器中踢回 xcode 并将其显示在屏幕上。
  • 控制器A如何“发送给控制器B”?你能告诉我们那个代码吗?

标签: ios objective-c xcode5


【解决方案1】:

这里有几种可能性;首先,iOS8 似乎比 iOS7 更早地实例化 VC,因此 viewDidLoad 中的导航树不完整,您应该只使用 viewDidLoad 进行附加初始化。尝试移动您的代码 [self LoadCredentials]; } 查看WillAppear。

其次,如果你有一个导航控制器,你应该通过导航控制器将新的 VC 添加到导航树中。如果是这种情况,请尝试以下代码。

  if([Username.text  isEqual: @""]) {
      [self showOkAlert:@"Username required"];
  }
  else if([Password.text isEqual:@""]) {
      [self showOkAlert:@"Password required"];
  }
  else  {
      //suppose that login was successfully.
      [self SaveCredentials];

     //This does not work - I receive a thread error not sure how to debug it 
      UIStoryboard *storyBoard = self.storyboard;
      UIViewController *targetViewController = [storyBoard instantiateViewControllerWithIdentifier:@"LatestNews"];
      UINavigationController *navController = self.navigationController;
    if (navController) {
        [navController pushViewController:targetViewController animated:YES];
    }

  }

【讨论】:

  • 从控制器 B 单击登录时不会加载控制器 A。但它会保存凭据。
  • 那么控制器A是主控制器?并在控制器 A 中检查用户是否已登录,如果没有,(在 ViewWillAppear 中)您发送到控制器 B?你是如何解雇控制器 B 的?控制器 A 已经在导航树中,所以您只需要关闭 B 而不是创建新的控制器 A...我错过了什么吗?
  • 现在,我把它放在控制器 B 中,它工作正常,就像你说的那样。
猜你喜欢
  • 1970-01-01
  • 2012-11-07
  • 2018-03-08
  • 2016-05-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多