繁体   English   中英

UITextField 第一响应者的 modalViewController 问题

[英]modalViewController issue with UITextField first responder

我有一个名为 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. 注销按钮关闭您的第一个模态视图,并且,

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

明确地说,您可以通过以下几种方式之一执行 2:

  1. 尝试并在导航 controller 上推送登录视图 controller(如果有的话);

  2. 在标签栏中选择它 controller (如果你使用一个);

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

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

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

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

以 0.0 的延迟执行performSelector仅具有调度yourSelector以在主循环上执行的效果。 这样,首先完全关闭模式,然后显示登录视图。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM