【问题标题】:shouldPerformSegueWithIdentifier issueshouldPerformSegueWithIdentifier 问题
【发布时间】:2014-04-28 13:05:17
【问题描述】:

我尝试了太多来解决我的波纹管问题,但我失败了。请帮我解决这个问题。我有登录视图,在验证 ID 和密码后,我将其推送到下一个视图控制器。请检查下图。

问题 - 当 ID 和密码正确时,它会推送到下一个视图控制器,但在单击登录按钮 2 次后。

代码-

ServiceManager.m

 -(void)initGetAppServiceRequestWithUrl:(NSString *)baseUrl onCompletion:  
 (ServiceCompletionHandler)handler
 {
     NSString *fullUrl = [NSString stringWithFormat:@"%@",[baseUrl 
            stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]];
     NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL 
            URLWithString:fullUrl]];
    [NSURLConnection sendAsynchronousRequest:(NSURLRequest *)request
                                   queue:[NSOperationQueue mainQueue] 
         completionHandler:^(NSURLResponse *response,NSData *data,NSError *error)
   {
     if (error) {
         handler(nil,error);
        // NSLog(@"error = %@",error);
    }
     else
     { handler(data, nil);
       // NSLog(@"data = %@",data);
     }
  }];

}

JSONResponseHandler.m

 +(void)handleResponseData:(NSData *)responseData onCompletion:(JSONHandler)handler
 {
     if (responseData) {
         NSError *jsonParseError;
         NSDictionary *json = [NSJSONSerialization JSONObjectWithData:responseData 
         options:kNilOptions error:&jsonParseError];
         if (!json) {
             handler(nil , jsonParseError);
         }
        else
        {
             handler (json , nil);
        }  
    }
}

ASKevrServiceManager.m

 -(void)login:(Login *)login completionHandler:(ServiceCompletionHandler)handler
 {
     NSString *loginUrl = [NSString    
     stringWithFormat:@"http://249development.us/johnsan/askever/login.php?
     login=%@&password=%@",login.emailAddr , login.password];
     [self initGetAppServiceRequestWithUrl:loginUrl onCompletion:^(id object, NSError 
      *error)
     {
        handler(object , error);
     }
    ];
  }

ASKevrOperationManager.m

  +(void)login:(Login *)login handler:(OperationHandler)handler
  {
       ASKevrServiceManager *serviceManager = [[ASKevrServiceManager alloc]init];
      [serviceManager login:login completionHandler:^(id object, NSError *error)
      {
          [JSONResponseHandler handleResponseData:object onCompletion:^(NSDictionary 
           *json , NSError *jsonError)
          {
            if(json)
            {
                handler(json , nil , YES);
             }
            else
            {
               handler(nil , jsonError , NO);
            }
        }];
    }];
 }

LoginViewController.m

-(BOOL)shouldPerformSegueWithIdentifier:(NSString *)identifier sender:(id)sender
{
   if ([identifier isEqualToString:@"pushTab"])
   {
     if ([emailTxt.text isEqualToString:@""] || [passwordTxt.text 
     isEqualToString:@""])
     {
       [self showAlertWithMessage:@"Please write your id or password"];
       return NO;
  }
 else
 {
    Login *loginModel = [[Login alloc]init];
    loginModel.emailAddr =emailTxt.text;
    loginModel.password = passwordTxt.text;
    [ASKevrOperationManager login:loginModel handler:^(id object , NSError *error , 
    BOOL success)
     {
         if (success)
         {
             NSLog(@"object =%@",object);
             NSDictionary *arr = [object objectForKey:@"response"];
             str = [arr objectForKey:@"flag"];
             //check for error
                 NSDictionary *toDict = [object objectForKey:@"response"];
                 currentUserId = [toDict objectForKey:@"c_id"];
                 NSLog(@"currentUserId = %@",currentUserId);
         }
         else
         {
             [self showAlertWithMessage:@"Wrong Id or Password."];
         }
     }];
    NSLog(@"str = %@",str);
    if ([str isEqualToString:@"1"])
    {
       // [self showAlertWithMessage:@"Wrong Id or Password."];
        return YES;
    }
   }
 }
return NO;
}

【问题讨论】:

  • @什么问题?你能详细说明一下吗
  • 当然,一旦用户成功通过身份验证,任何身份验证视图控制器都应该弹出;它不应该呈现更多的视图控制器,因为它可能随时被调用以重新验证?
  • @trojanfoe:实际上我在一个地方发现了错误-“initGetAppServiceRequestWithUrl:”首先调用了这个方法,然后我得到了 JSON 对象。但是当我第一次点击有效身份验证时它不是发送 JSON 对象,当我使用相同的身份验证第二次单击它时,它正在发送 JSON 并调用 push segue。
  • @meda : 我已经放了一行名为“Issue”的行。请检查一下。
  • @chaaruu 您是否将转场直接附加到按钮上?你不应该,也登录不应该是导航的一部分

标签: ios uistoryboardsegue


【解决方案1】:

当按下登录按钮时运行代码

if (![emailTxt.text isEqualToString:@""] &&
    ![passwordTxt.text isEqualToString:@""]){
    Login *loginModel = [[Login alloc]init];
    loginModel.emailAddr =emailTxt.text;
    loginModel.password = passwordTxt.text;
    [ASKevrOperationManager login:loginModel handler:^(id object , NSError *error , 
    BOOL success)
     {
         if (success){
             NSLog(@"object =%@",object);
             NSDictionary *arr = [object objectForKey:@"response"];
             str = [arr objectForKey:@"flag"];
             //check for error
                 NSDictionary *toDict = [object objectForKey:@"response"];
                 currentUserId = [toDict objectForKey:@"c_id"];
                 NSLog(@"currentUserId = %@",currentUserId);

            //perform the segue only when succesful
            [self performSegueWithIdentifier:@"yourSegue" sender:sender];
         }else{
            [self showAlertWithMessage:@"Wrong Id or Password."];
         }
     }];    
}else {
    [self showAlertWithMessage:@"Please write your id or password"];
}

保持shouldPerformSegueWithIdentifier 简单

-(BOOL)shouldPerformSegueWithIdentifier:(NSString *)identifier sender:(id)sender
{
   if ([identifier isEqualToString:@"pushTab"])
   {
        //don't put logic here
        //put code here only if you need to pass data
        //to the next screen
        return YES:
   }
   return NO;
}

【讨论】:

  • 感谢您的回复。媒体,我已经尝试过了,但问题出在我的 URL 调用方法中。每次我需要在前一个视图上调用我的“ServiceOperation”方法,因为它在调用所有行之后调用它的功能。所以,在上面的代码中,我的“str”变量第一次没有获得价值,下一次它从以前保存价值对象..这就是为什么它需要点击 2 次但我无法解决这个问题。你能帮我解决这个问题吗。
  • 我不确定我是否真的明白,str 有什么用?
猜你喜欢
  • 1970-01-01
  • 2019-12-15
  • 1970-01-01
  • 1970-01-01
  • 2015-01-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多