无法识别的选择器发送到实例 resignFirstResponder

Posted

技术标签:

【中文标题】无法识别的选择器发送到实例 resignFirstResponder【英文标题】:unrecognized selector sent to instance resignFirstResponder 【发布时间】:2014-03-25 03:10:17 【问题描述】:

我在我的应用程序中使用TPKeyboardAvoiding 在键盘显示时隐藏移动文本字段,但是当我尝试结束编辑文本字段时出现异常。它来自TPKeyboardAvoiding中的这个方法:

- (void) touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event 
    UIView* view =[self TPKeyboardAvoiding_findFirstResponderBeneathView:self];
    NSLog(@"%@",[view description]);
    [view resignFirstResponder]; //this line gives the exception
    [super touchesEnded:touches withEvent:event];

我在这里有点困惑。不是所有的 UIView 都应该响应 resignFirstResponder 吗?感谢您的帮助。

完全错误:

2014-03-25 17:40:39.919 Rysk[5553:70b] -[MenuViewController textFieldDidBeginEditing:]: unrecognized selector sent to instance 0xb63c820

【问题讨论】:

试试这个:[self.view endEditing:YES]; 试试if ([view isKindOfClass:[UITextField class]] || [view isKindOfClass:[UITextView class]]) [view resignFirstResponder]; @troop231 我也遇到了例外情况 [view endEditing:YES];怎么样 我也有例外 【参考方案1】:

不确定您是否也致电[yourTextField resignFirstResponder]。因此,UITextField(在您提供的代码中)此时可能不是 FirstResponder。我建议像这样调整您的代码:

- (void) touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event 
    UIView* view =[self TPKeyboardAvoiding_findFirstResponderBeneathView:self];

    if([view conformsToProtocol:@protocol(UITextFieldDelegate)] || [view conformsToProtocol:@protocol(UITextViewDelegate)]) && 
       [view isFirstResponder] && [view canResignFirstResponder])
    
       [view resignFirstResponder];  
    

    [super touchesEnded:touches withEvent:event];

另外,如果您使用 POD,请确保您使用的是最新版本,因为我正在使用的 POD 在本次活动中是这样的:

- (void) touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event 
    [[self TPKeyboardAvoiding_findFirstResponderBeneathView:self] resignFirstResponder];
    [super touchesEnded:touches withEvent:event];

希望对你有帮助!

【讨论】:

感谢您的回答。尽管如此,我仍然在该行上遇到无法识别的选择器错误。我的代码以前也是这样,我稍微改了一下,试图找出错误在哪里。 你也自己辞职吗?我的意思是在这堂课之外?也检查我的更新 我仍然得到相同的异常检查,如果它可以 resignFirstResponder。唯一调用 resignFirstResponder 的地方是在该类中 您是在单个屏幕上还是在应用程序级别上收到此异常?您可以发布完整的错误消息吗?我想它还告诉了哪个选择器无法识别以及在哪个控制器中。【参考方案2】:

如下更新您的代码:

- (void) touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event 
    UIView* view =[self TPKeyboardAvoiding_findFirstResponderBeneathView:self];
    NSLog(@"%@",[view description]);
    if([view isKindOfClass:[UITextField class]]) 
        UITextField *myTextField = (UITextField *)view;
        [myTextField resignFirstResponder];
    
    [super touchesEnded:touches withEvent:event];

【讨论】:

感谢您的回答。我仍然在 resignFirstResponder 线上遇到异常 异常是什么意思? '无法识别的选择器发送到实例 0xb44b1a0'【参考方案3】:

试试这个简单的方法....

- (void)viewDidLoad

    [super viewDidLoad];

    //--Gesture to resign keyborad on touch outside
    UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(dismissKeyboard)];
    tap.cancelsTouchesInView = NO;
    [self.view addGestureRecognizer:tap];



//-- Resign keyboard on touch UIView
-(void)dismissKeyboard

    self.view.frame = CGRectMake(self.view.frame.origin.x, 0, self.view.frame.size.width, self.view.frame.size.height);
    [self.view endEditing:YES];

【讨论】:

.m 文件的 viewDidLoad 中的前 3 行。下一个方法 dismissKeyboard 放置代码的任何位置... 在查找 self.fields_view 时出现错误。我想我应该用一个文本字段替换它,但我有多个文本字段【参考方案4】:

我通过让包含 TPKeyboardAvoidingScrollView 的视图控制器实现 UITextFieldDelegate 协议解决了这个问题。最重要的是,这两种方法:

- (void)textFieldDidBeginEditing:(UITextField *)textField
- (void)textFieldDidEndEditing:(UITextField *)textField

【讨论】:

以上是关于无法识别的选择器发送到实例 resignFirstResponder的主要内容,如果未能解决你的问题,请参考以下文章

[UICollectionViewCell imageView]:无法识别的选择器发送到实例

UISwipeGesture '发送到实例的无法识别的选择器'

无法识别的选择器发送到实例

无法识别的选择器发送到数组中的实例[重复]

无法识别的选择器发送到实例 Objective-C

无法识别的选择器发送到实例