2011-06-08 85 views
0

我有一个名为LoginViewController的UIViewController。 UIViewController有两个UITextField,用户名和密码。当第一次启动应用程序并且钥匙串中没有任何凭证时,这将显示为modalViewController。当用户点击登录按钮时,呈现的键盘被解除。代码是:modalViewController问题与UITextField第一响应者

- (IBAction) loginClick: (UIButton *) sender 
{ 
    if ([username isFirstResponder]){ 
     [username resignFirstResponder]; 
    } 

    if ([password isFirstResponder]){ 
     [password resignFirstResponder]; 
    } 

    [RKObjectManager sharedManager].client.username = username.text; 
    [RKObjectManager sharedManager].client.password = password.text; 
    [progressLock lock]; 
    [progressLock unlockWithCondition:0]; 
    [HUD showWhileExecuting:@selector(myTask) onTarget:self withObject:nil animated:YES]; 
    [[RKObjectManager sharedManager] loadObjectsAtResourcePath:@"/account/verify.json" objectClass:[Login class] delegate: self]; 
} 

现在在应用程序中有一个选项按钮。当这是点击它会呈现一个modalViewController,它有一个注销按钮。点击这个注销按钮将再次呈现LoginViewController。代码是:

- (IBAction) logout:(id)sender 
{ 
    NSUserDefaults *standardDefaults = [NSUserDefaults standardUserDefaults]; 
    NSString * username = [standardDefaults stringForKey:@"kApplicationUserNameKey"]; 
    NSError * error = nil; 

    [standardDefaults removeObjectForKey:@"kApplicationUserNameKey"]; 
    [SFHFKeychainUtils deleteItemForUsername:username andServiceName:@"convore" error:&error]; 
    LoginViewController* lvc = [[LoginViewController alloc] init]; 
    lvc.delegate = self; 
    [self.mgvc.groups removeAllObjects]; 
    [self.mgvc.table reloadData]; 

    Topic * topic = [Topic object]; 
    topic.tid = [NSNumber numberWithInt:-2]; 
    self.mgvc.detailViewController.topic = topic; 
    self.mgvc.detailViewController.detailItem = topic.tid; 

    [self presentModalViewController:lvc animated:YES]; 
    [lvc release]; 
} 

奇怪的是,我似乎无法解雇键盘,当我点击登录按钮这次。为什么是这样?是否因为从现在开始,我正在使用modalviewcontroller显示LoginViewController?我如何解决这个奇怪的问题?

回答

0

我不知道你不能否认键盘的事实是因为在模态视图中显示登录名,也没有发现任何明显的代码错误。

我会建议你改变你的流量,使:

  1. 注销按钮解雇你的第一个模式的看法和,

  2. 登录视图中显示为普通视图,一旦模式视图消失。

明确,你可以做2或者通过多种手段之一:

  1. 努力,推动登录视图控制器的导航控制器(如果有的话);

  2. 在标签栏控制器中进行选择(如果使用的话);

  3. 您的模态视图显示在视图上方;当模式被解除时,该视图再次出现,因此其视图控制器的选择器被调用;这是您可以检查您是否登录或注销并在必要时显示登录名的地方;如果您不知道如何检测是否处于进出状态,那么当您关闭注销模式视图时,您始终可以在视图控制器中设置一个标志。

    1. (读您的评论后:模式的看法是不是全屏,所以viewWillAppear不叫:你可以自己送viewWillAppear,或发送不同,自定义消息,你的上级视图控制器,使其知道登录视图应该显示(并可能刷新视图)

    2. 编辑:尝试这样的事情(这需要你打电话给你自己的选择,而不是viewWillAppear):

      [baseNonModalViewController performSelector:@selector(yourSelector) withObject:nil afterDelay:0.0];

使用0执行performSelector。0延迟仅具有调度yourSelector在主循环上执行的效果。这样,首先模式将被彻底解散,然后登录视图将被显示。

+0

这是一个好主意,所以你的意思是[self dismissModalViewControllerAnimated:YES]; [self presentModalViewController:lvc animated:YES]; ??我试过了,它不起作用..也许这不是它应该的方式 – adit 2011-06-08 15:54:24

+0

你应该尝试从模态视图之外做到这一点,以产生影响。查看我的编辑,特别是我添加的选项3。 – sergio 2011-06-08 15:55:56

+0

我怎样才能从外面做到这一点?代表你的意思? – adit 2011-06-08 15:57:11

相关问题