3

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

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

真的,我想UITextField用键盘右下角的“隐藏按钮”让我的显示器成为一个键盘,但我找不到正确的键盘类型。也许我需要将文本字段 retuntype 设置为“...完成”。这样,我看到“返回”键变成“完成”。

所以我将工具栏设置为我UITextFieldinputAccessoryView,所以现在我可以显示一个标准键盘,上面有一个工具栏,上面有“完成”按钮。当用户触摸该按钮时,我使用该resignFirstResponder方法隐藏键盘。

奇怪的是,当我打电话时resignFirstResponderUIKeyboardWillHideNotification没有发布;至少keyboardWillHide:没有调用该方法。

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

非常感谢您的帮助...

(添加:)

viewDidLoad

[[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]];    

我从“你的”帖子中获取了这些声明:-) 但是 willShow 有效......

UIToolbar分配为inputAccessoryView我的文本字段的“完成”按钮的操作是:

-(void)keyboardDone {
    [msgTextField resignFirstResponder];

关闭:好的!当开发人员很愚蠢时......它很愚蠢:-) :-)

这是我更正后的 willHide 方法:

-(void)keyboardWillHide:(NSNotification*)n {
    NSDictionary* userInfo;
    CGSize keyboardSize;
    CGRect viewFrame;

    /* This was the bad guy :) I forgot to delete it
     * after I previously copied the willShow method that
     * checks if keyboard is already shown (if so returns).
     *
     * if( keyboardIsShown )
     *   return;
     */
    userInfo = [n userInfo];
    keyboardSize = [[userInfo objectForKey:UIKeyboardFrameBeginUserInfoKey] CGRectValue].size;
    viewFrame = [[self scrollView] frame];
    viewFrame.size.height += ( keyboardSize.height - TABBAR_HEIGHT );

    [UIView beginAnimations:nil context:NULL];
    [UIView setAnimationBeginsFromCurrentState:YES];
    [UIView setAnimationDuration:0.5];
    [[self scrollView] setFrame:viewFrame];
    [UIView commitAnimations];

    keyboardIsShown = NO;
    NSLog(@"HIDE\n");
}

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

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

4

5 回答 5

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];
于 2012-09-07T19:08:13.110 回答
2

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

于 2016-04-26T03:52:45.837 回答
1

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

[self.view endEditing:YES];

也请提供您的keyboardWillHide:方法。

于 2012-09-07T21:41:04.160 回答
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];
}

此外,如果您使用 Interface builder 创建接口,请不要忘记为 TextField 设置 IBOutlet 引用;否则,您的班级将不会收到来自 XIB 的消息。

我在一个示例应用程序中进行了设置,只是为了查看它是否工作以及它是否按照您希望应用程序执行的方式执行。

于 2012-09-07T22:29:18.043 回答
0

斯威夫特 $

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

func keyboardWillHide(notification: NSNotification){
     print("keyboardWillHide")
}
于 2018-01-25T18:21:22.063 回答