【问题标题】:iOS 5 Segue not working after the first executioniOS 5 Segue 在第一次执行后不工作
【发布时间】:2012-03-05 19:37:51
【问题描述】:

我正在使用情节提要功能创建一个 iOS5 应用程序。基本结构是:

LoginScreen ---(segue)--> MyScreen ---(注销时按下)------(返回登录屏幕)-->LoginScreen

这很简单。我管理第一个转场的方式是:

- (void) onResponse:(NSMutableDictionary *)response {
  NSLog(@"Login successful,token received");
  // if the Login was successful,store the token 
  NSUserDefaults* userPref = [NSUserDefaults standardUserDefaults];    
  [userPref setObject:[response objectForKey:@"Token"] forKey:@"AuthToken"];
  [userPref synchronize];
  //..and let the user getting in
  [self performSegueWithIdentifier:@"showHomeScreen" sender:nil];
}

现在,奇怪的是第一次正确执行了 segue,但是,当我在注销后返回登录屏幕时,performSegueWithIdentifier: 不再起作用(没有错误消息,根本没有任何反应)。不知道发生了什么。可能是哪个问题?

我附上了故事板的屏幕截图..您可以在右上角看到循环:

非常感谢!

克劳斯

【问题讨论】:

    标签: iphone ios5 segue xcode-storyboard


    【解决方案1】:

    LoginVC 似乎连接了多个 Segue。

    处理登录过程的最佳方法是使用登录视图控制器的委托。然后在主 VC 中,检查凭据或其他内容,如果需要,请为 LoginVC 调用 performSegue。登录成功后,调用委托方法,Main VC 将关闭模式视图。 LoginVC 真的不应该是导航的一部分,也不应该连接到除 Main VC 之外的任何其他 Segue。如果您需要,我有一个完整的示例,但是使用委托方法很容易实现。

    给你: LoginViewController.h:

    @protocol LoginViewControllerDelegate
        -(void)finishedLoadingUserInfo;
    @end
    
    @interface LoginViewController : UIViewController <UITextFieldDelegate>{
        id <LoginViewControllerDelegate> delegate;
    }
    

    LoginViewController.m:

    @synthesize delegate;
    
    - (void) onResponse:(NSMutableDictionary *)response {
      NSLog(@"Login successful,token received");
      // if the Login was successful,store the token 
      NSUserDefaults* userPref = [NSUserDefaults standardUserDefaults];    
      [userPref setObject:[response objectForKey:@"Token"] forKey:@"AuthToken"];
      [userPref synchronize];
      //..and let the user getting in
      [delegate finishedLoadingUserInfo];
    }
    

    在 Dashboard VC .m 文件中:

    #pragma mark - LoginViewController Delegate Method
    -(void)finishedLoadingUserInfo
    {    
        // Dismiss the LoginViewController that we instantiated earlier
        [self dismissModalViewControllerAnimated:YES];
        
        // Do other stuff as needed
    }
    

    所以要点是在应用加载时检查凭据,如果需要,调用(在 Dashboard VC 中):

    [self performSegueWithIdentifier:@"sLogin" sender:nil];
    

    然后在 prepareForSegue 方法中(在 Dashboard VC 中):

    -(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
        if ([segue.identifier isEqualToString:@"sLogin"]) {
            LoginViewController *livc = segue.destinationViewController;
            livc.delegate = self; // For the delegate method
        }
    }
    

    确保命名 Segue sLogin 否则这将不起作用:)

    【讨论】:

    • 嗨,Eljay,感谢您的回答。是的,请提供一个工作示例,这对阅读该主题的人来说非常有用。你能发一下吗?我已经尝试过使用代理来关闭 viewController 的方法,但在我的情况下,应该使用导航控制器(tab+nav),它有点复杂。
    • 除此之外,拥有多个 Segue 的问题是什么?
    • 拥有多个segue不是问题,但在您的情况下,应该只有一个。 LoginVC 不应连接到 NavController。将在几分钟内修改答案以包含一个示例
    • 非常感谢!我仍然不明白为什么 performSegueWithIdentifier: 只在第一次工作。
    • 嗨 ElJay,只是在观察。我一直在研究这个例子。我正在 viewWillAppear 中检查我的授权令牌:方法 // 检查是否设置了令牌,如果没有触发登录屏幕 NSString* token = nil; NSUserDefaults* userPref = [NSUserDefaults standardUserDefaults]; token = [userPref objectForKey:@"AuthToken"]; if (token == nil) { NSLog(@"令牌不存在,需要登录!"); [self performSegueWithIdentifier:@"sLogin" sender:nil]; } [super viewWillAppear:YES];` 该应用程序运行良好,只是第一次使用
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-12-12
    • 2020-03-25
    • 1970-01-01
    • 1970-01-01
    • 2015-02-25
    • 1970-01-01
    • 2021-05-13
    相关资源
    最近更新 更多