【问题标题】:How to set the UIView become first Responder?如何设置 UIView 成为第一响应者?
【发布时间】:2016-02-03 03:14:26
【问题描述】:

我现在正在学习UIResponder。我写了一些测试代码。在我的代码中,我想让UIView 成为第一响应者,但我失败了。我的测试步骤是:

  1. 在情节提要中创建UIView
  2. 为此视图创建了一个扩展UIView 的类,并覆盖方法canBecomeFirstResponder:becomeFirstResponder 以返回YES

  3. 在视图控制器的viewDidAppear:方法的方法中,测试一下:

    - (void) viewDidAppear:(BOOL)animated {
        [self.viewD becomeFirstResponder];
        NSLog(@"%d ", [self.viewD isFirstResponder]);
    }
    

isFirstResponder 的结果总是NO

我不知道为什么。有谁能够帮助我?谢谢。

【问题讨论】:

  • @Aaron Brager 谢谢 :)

标签: ios uiresponder


【解决方案1】:

becomeFirstResponder 通知接收者它将成为其窗口中的第一响应者。 如果接收者接受第一响应者状态,则为 YES,如果它拒绝此状态,则为 NO。默认实现返回 YES,接受第一响应者状态。

只有当当前响应者可以放弃第一响应者状态(canResignFirstResponder)并且新响应者可以成为第一响应者时,响应者对象才会成为第一响应者。

在您的情况下,您的视图拒绝状态,这就是为什么每次都是 NO。

【讨论】:

  • 感谢您的回复。为什么视图拒绝它?因为当前的响应者不能辞去第一响应者的身份? -->" [[UIApplication sharedApplication] sendAction:@selector(resignFirstResponder) to:nil from:nil forEvent:nil];"可以辞职第一响应者,我做到了。因为 userinteractionEnabled 的值为 NO? --> 检查后为YES
  • 这能解决您的问题吗?
  • 所有视图都是通过故事板创建的。我认为是的。
  • 不,isFirstResponder的结果也是NO。
【解决方案2】:

所以在你的覆盖中确保你的调用超级

还有 您可以尝试确保视图在前面并且可见 您可以尝试结束当前父视图的编辑 在调用 becomeFirstResponder 之前

[self.view bringSubviewToFront:self.D];
  [self.view endEditing:true];
  [self.D becomeFirstResponder];

还有什么理由你没有在 ViewDidAppear 中调用 super 吗?

【讨论】:

  • 嗨大卫杨刘。我做到了,但......也没有。我还在方法的第一行调用了 [super viewDidAppear:animated]。
  • 在我的视图实现文件中删除代码后,它可以工作了! //-(BOOL)becomeFirstResponder //{ // return YES; //}
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-01
  • 2023-03-24
  • 2019-10-23
  • 1970-01-01
  • 2011-07-07
  • 1970-01-01
相关资源
最近更新 更多