UIKeyboardWillHide没有被触发

时间:2012-09-07 16:37:12

标签: iphone ios notifications uikeyboard

我在这里阅读了很多关于这个主题的帖子,但我无法找到我的问题的答案,所以,希望你不会对另一个UIKeyboard帖子感到无聊:-)

在我的视图控制器的实现中,我添加了self作为两个通知UIKeyboardWillShowNotificationUIKeyboardWillHideNotification的观察者,通过选择器keyboardWillShow:keyboardWillHide:来处理通知。当我触摸UITextField时,会调用keyboardWillShow:方法,但是当我按下“完成”按钮(取消键盘)时,不会调用keyboardWillHide:方法。

真的,我想让我的UITextField在键盘右下角显示一个带有“隐藏按钮”的键盘,但我找不到合适的键盘类型。也许我需要将textfield retuntype设置为“... Done”。以这种方式,我看到“返回”键变为“完成”。

所以我将工具栏设置为UITextField的{​​{1}},现在我可以使用“完成”按钮显示带有上方工具栏的标准键盘。当用户触摸该按钮时,我使用inputAccessoryView方法隐藏键盘。

奇怪的是,当我致电resignFirstResponder时,resignFirstResponder未张贴;至少不调用UIKeyboardWillHideNotification方法。

你对我有什么建议?我真的很想用带有向下箭头的小按钮显示一个键盘以隐藏键盘,但这个解决方案也可能是正确的,但我想调整视图大小并执行此操作我需要观察keyboardWillHide:

非常感谢您的帮助......

(ADDED :)

UIKeyboardWillHideNotification

viewDidLoad

我从“你的”帖子之一接受了这些声明:-)但是willShow有效......

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillShow:) name:UIKeyboardWillShowNotification object:[[self view] window]]; [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillHide:) name:UIKeyboardWillHideNotification object:[[self view] window]]; 中被指定为我的文字字段UIToolbar的“完成”按钮的操作是:

inputAccessoryView

CLOSED: 好!当一个开发人员是愚蠢的......这是愚蠢的:-) :-)

这是我更正后的willHide方法:

-(void)keyboardDone {
    [msgTextField resignFirstResponder];

首先,我要感谢大家帮助我做这项无用的工作。我想给你一些观点,所以我会尝试为每个答案提出一个“兴趣点”,但我需要选择正确的......难点...... :-)

再次打扰一下......我真的没有看到if()语句......

5 个答案:

答案 0 :(得分:3)

如果您阅读UIWindow的文档,则表示这些通知的通知对象为nil。您将self.view.window作为对象传递给addObserver:selector:name:object:方法。请尝试传递nil

[[NSNotificationCenter defaultCenter] addObserver:self
                                         selector:@selector(keyboardWillShow:)
                                             name:UIKeyboardWillShowNotification
                                           object:nil;
[[NSNotificationCenter defaultCenter] addObserver:self
                                         selector:@selector(keyboardWillHide:)
                                             name:UIKeyboardWillHideNotification
                                           object:nil];

答案 1 :(得分:1)

检查keyboardDone是否真的被调用(即使用NSLog(@"%@", @"keyboard done called");)。如果它被调用,但resignFirstResponder无法解除键盘,那么试试这个:

[self.view endEditing:YES];

请同时提供keyboardWillHide:方法。

答案 2 :(得分:1)

要设置键盘以使其具有“完成”按钮,请执行以下操作:

1)设置视图控制器,使其实现UITextFieldDelegate。例如:

#import <UIKit/UIKit.h>

@interface TX_ViewController : UIViewController <UITextFieldDelegate>

@property (nonatomic, retain) IBOutlet UITextField *textField;

@end

2)在视图控制器实现文件中,使用以下代码设置键盘:

- (void)viewDidLoad
{
    [self.textField setDelegate:self];
    [self.textField setReturnKeyType:UIReturnKeyDone];
    [self.textField addTarget:self action:@selector(textFieldFinished:) forControlEvents:UIControlEventEditingDidEndOnExit];

    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
}

3)如果您希望在按下 DONE 按钮时执行某些操作,只需将以下功能添加到视图控制器的实现文件中:

- (IBAction)textFieldFinished:(id)sender
{
    [sender resignFirstResponder];
}

此外,如果您使用“界面”构建器来创建界面,请不要忘记为TextField设置IBOutlet参考;否则,您的班级将不会收到来自XIB的消息。

我在一个示例应用程序中进行了设置,看看它是否有效,并且它确实按照您希望的方式执行。

答案 3 :(得分:0)

值得注意的是,当用户通过隐藏按钮隐藏软件键盘时,不会调用隐藏方法。再次调用show方法,但除主页行工具栏外,键盘几乎不在屏幕上。

答案 4 :(得分:0)

Swift $

NotificationCenter.default.addObserver(self, selector: #selector(self.keyboardWillHide), name: NSNotification.Name.UIKeyboardWillHide, object: nil)

func keyboardWillHide(notification: NSNotification){
     print("keyboardWillHide")
}