2014-04-28 103 views
0

我试图解决以下问题,但我失败了。请帮我解决这个问题。我有登录视图,在验证了id和密码后,我将它推送到下一个视图控制器。请检查下面的图像。 enter image description hereshouldPerformSegueWithIdentifier issue

问题 - 当Id和Password正确时,它会推送到下一个视图控制器,但在登录按钮上点击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; 
} 
+0

@what是问题?你能详细说明吗? – meda

+0

当用户成功认证后,任何认证视图控制器都应该弹出;它不应该提供进一步的视图控制器,因为它可能随时被调用来重新认证? – trojanfoe

+0

@trojanfoe:其实我在一个地方发现错误 - “initGetAppServiceRequestWithUrl:”首先调用此方法,然后我得到JSON object.But当我第一次用有效身份验证点击时,它不发送JSON对象,当我第二次使用相同的身份验证发送JSON以及调用push segue。 – chaaruu

回答

0

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

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; 
} 
+0

谢谢您的回复。媒体,我已经试过这个,但问题出在我的URL调用方法。每次我需要在前面的视图中调用我的“ServiceOperation”方法,因为它在调用所有行之后调用它的功能。因此,在上面的代码中,我的“str”变量在第一次没有获得值,下一次它将保存之前的值对象..这就是为什么它需要2点击,但我无法解决这个问题。你能帮我解决这个问题。 – chaaruu

+0

我不确定我真的明白,'str'有什么用? – meda