3

このトピックに関する多くの投稿をここで読みましたが、私の質問に対する答えを見つけることができなかったので、別の UIKeyboard の投稿に飽きないことを願っています :-)

私のView Controllerの実装では、2つの通知とselfのオブザーバーとして追加し、セレクターを渡し、通知を処理しました。に触れるとメソッドが呼び出されますが、「完了」ボタン(キーボードを閉じる)を押してもメソッドは呼び出されません。UIKeyboardWillShowNotificationUIKeyboardWillHideNotificationkeyboardWillShow:keyboardWillHide:UITextFieldkeyboardWillShow:keyboardWillHide:

本当は、UITextFieldショーをキーボードの右下にある「非表示ボタン」のあるキーボードにしたいのですが、適切なキーボードの種類が見つかりませんでした。たぶん、テキストフィールドのretuntypeを「...Done」に設定する必要があります。そのようにして、「戻る」キーが「完了」に変わることがわかりました。

そこで、ツールバーを自分UITextFieldのに設定したinputAccessoryViewので、「完了」ボタンで上部にツールバーを備えた標準キーボードを表示できます。ユーザーがそのボタンに触れると、resignFirstResponderメソッドでキーボードを非表示にします。

奇妙なことに、 を呼び出したときにresignFirstResponderUIKeyboardWillHideNotificationが投稿されません。少なくともkeyboardWillHide:メソッドは呼び出されません。

あなたは私に何を提案しますか? 私は本当にキーボードを非表示にするために下向き矢印の付いた小さなボタンでキーボードを表示したかったのですが、この解決策も正しいかもしれませんが、ビューのサイズを変更してこれを行うには、observer が必要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]];    

これらの宣言は、「あなたの」投稿の1つから取得しました:-)しかし、willShowは機能します...

私のテキストフィールドにUIToolbar割り当てられている「完了」ボタンのアクションは次のとおりです。inputAccessoryView

-(void)keyboardDone {
    [msgTextField resignFirstResponder];

閉店:OK!開発者が愚かであるとき...それは愚かです:-) :-)

これは私の修正された 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、View Controller の実装ファイルに次の関数を追加するだけです。

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

また、Interface builder を使用してインターフェイスを作成している場合は、TextField の IBOutlet 参照を設定することを忘れないでください。そうしないと、クラスは XIB からメッセージを受信しません。

これが機能するかどうかを確認するためだけに、サンプル アプリケーションでこれをセットアップし、アプリケーションで実行したい方法で実行しました。

于 2012-09-07T22:29:18.043 に答える