modalViewController问题与UITextField第一响应者

时间:2011-06-08 15:40:52

标签: iphone objective-c uikeyboard

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

- (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?我该如何解决这个奇怪的问题?

1 个答案:

答案 0 :(得分:0)

我不知道你不能解除键盘的事实是由于在模态视图中显示登录,我也没有看到你的代码有任何明显错误。

我建议你改变你的流程并制作:

  1. 退出按钮会关闭您的第一个模态视图,

  2. 一旦模态视图消失,您的登录视图将显示为普通视图。

  3. 明确地说,你可以通过以下几种手段之一做到2:

    1. 尝试并按下导航控制器上的登录视图控制器(如果有的话);

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

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

      1. (阅读评论后:模态视图不是全屏,因此不会调用viewWillAppear:您可以自己发送viewWillAppear,也可以向上级发送不同的自定义消息查看控制器,以便它知道应该显示登录视图(并可能刷新视图)。

      2. 编辑:尝试这样的事情(这需要你调用自己的选择器,而不是viewWillAppear):

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

    4. 以0.0延迟执行performSelector只会调度yourSelector以便在主循环上执行。这样,首先将完全取消模态,然后将显示登录视图。