web-dev-qa-db-ja.com

iPhoneのキーボードを閉じる

サファリで使用されているポップアップキーボードに似たものを再現しようとしています。

alt text

ビューと適切なボタンの上にツールバーを配置することで視覚的に再現できますが、ユーザーが完了ボタンに触れた後、キーボードを閉じる方法がわかりません。

15
Lounges

やってみました:

[viewReceivingKeys resignFirstResponder];

ここで、viewReceivingKeysはテキスト入力を受信して​​いるUIViewですか?

26
Frank Krueger

覚えておく必要のあることがいくつかあります。開発者が設定するのを忘れている一番の部分は、textFieldのdelegateです。

Interface Builderを使用している場合は、textFieldのデリゲートをファイルOwnerに設定する必要があることを覚えておく必要があります。

Interface Builderを使用していない場合は、テキストフィールドのデリゲートを自分自身に設定してください。 returnTypeも含めます。たとえば、textFieldがgameFieldと呼ばれた場合:

gameField.delegate = self;
gameField.returnKeyType = UIReturnKeyDone;

また、ViewControllerにITextFieldDelegateを実装する必要があります。

@interface YourViewController : UIViewController <UITextFieldDelegate> 

最後に、textFieldShouldReturnメソッドを使用して、[textField resignFirstResponder]を呼び出す必要があります。

   -(BOOL) textFieldShouldReturn:(UITextField*) textField {
    [textField resignFirstResponder]; 
    return YES;
}

すべてのtextFieldsはこれと同じメソッドを使用するため、この設定は1回だけで済みます。デリゲートがtextFieldに設定されている限り、UITextFieldDelegateがインターフェイスに実装され、textFieldShouldReturnメソッドを追加して、セットのresignFirstResponderを呼び出します。

50
Niels Hansen

Interface Builderで独自のビューを構築する場合は、View Controllerをテキストフィールドのデリゲートに設定し、ViewsControllerのUITextFieldDelegateからtextFieldShouldReturn:を実装します。

- (BOOL)textFieldShouldReturn:(UITextField *)theTextField 
{
    NSLog(@"%@ textFieldShouldReturn", [self class]);
    [theTextField resignFirstResponder];
    // do stuff with the text
    NSLog(@"text = %@", [theTextField text]);
    return YES;
}

ITextFieldDelegate textFieldShouldReturn:iphone cocoa docs内

6
Ryan Townshend

キーボードをUITextFieldではなくUITextViewから削除することについて話している場合。あなたの質問はそれほど明確ではありませんか?次に、クラスがインターフェイスファイルでUITextFieldDelegateとしてマークされていることを確認した場合は

@interface MyController: UIViewController <UITextFieldDelegate> {
   UITextField *activeTextField;

   // ...remainder of code not show ...
}

次に、以下の2つのデリゲートメソッドを実装する必要があります。

- (BOOL)textFieldShouldBeginEditing:(UITextField *)textField {
    activeTextField = textField;!    
    return YES;
}

- (BOOL)textFieldShouldReturn:(UITextField *)textField {
    activeTextField = nil; 
    [textField resignFirstResponder];
    return YES;
}

ただし、UITextViewを使用している場合は、少し複雑になります。 UITextViewDelegateプロトコルには、textFieldShouldReturn:メソッドと同等の方法がありません。おそらく、Returnキーが、ユーザーが複数行のテキストエントリのテキストの編集を停止したいというシグナルであると期待すべきではないためです。ダイアログ(結局のところ、ユーザーはReturnキーを押して改行を挿入したい場合があります)。

ただし、キーボードを使用してUITextViewがファーストレスポンダーとして辞任できないことを回避する方法はいくつかあります。通常の方法は、UITextViewがポップアップキーボードを表示しているときに、ナビゲーションバーにDoneボタンを配置することです。タップすると、このボタンはテキストビューにファーストレスポンダーとして辞任するように要求し、その後キーボードを閉じます。

ただし、インターフェースの計画方法によっては、ユーザーがUITextView自体の外側をタップしたときにUITextViewを辞任させたい場合があります。これを行うには、UIViewをサブクラス化してタッチを受け入れ、ユーザーがビュー自体の外側をタップしたときに辞任するようにテキストビューに指示します。

新しいクラスを作成し、

#import <UIKit/UIKit.h>

@interface CustomView : UIView {
   IBOutlet UITextView *textView;
}

@end

次に、実装で、touchesEnded:withEvent:メソッドを実装し、UITextViewにファーストレスポンダーとして辞任するように依頼します。

#import "CustomView.h"

@implementation CustomView

- (id)initWithFrame:(CGRect)frame {
    if (self = [super initWithFrame:frame]) {
        // Initialization code
    }
    return self;
}

- (void) awakeFromNib {
    self.multipleTouchEnabled = YES;
}

- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {
    NSLog(@"touches began count %d, %@", [touches count], touches);

    [textView resignFirstResponder];
    [self.nextResponder touchesEnded:touches withEvent:event];
}

@end

クラスを追加したら、すべての変更を保存してから、InterfaceBuilderに移動してビューをクリックする必要があります。ユーティリティページでIdentityInspectorを開き、nibファイルのビューのタイプをデフォルトのCustomViewクラスではなくUIViewに変更します。次に、接続インスペクターで、textViewコンセントをUITextViewにドラッグします。これを行った後、アプリケーションを再構築すると、アクティブなUI要素の外側をタッチするとキーボードが閉じます。ただし、サブクラス化するUIViewが他のUI要素の「背後」にある場合、これらの要素はUIViewレイヤーに到達する前にタッチをインターセプトすることに注意してください。したがって、このソリューションは洗練されていますが、一部の状況でのみ使用できます。多くの場合、キーボードを閉じるには、ナビゲーションバーに完了ボタンを追加する強引な方法に頼る必要があります。

2
Alasdair Allan

ナビゲーションコントローラーを使用して、完了したらビューをポップしますか?

たとえば、次のようなコードを使用して、aboutボックスを次の場所にスライドさせます。

[[self navigationController] presentModalViewController:modalViewController animated:YES];

そして、そのaboutボックスのボタンがクリックされると、これを使用してそれを取り除きます。

[self.navigationController dismissModalViewControllerAnimated:YES];

私の場合、aboutボックスが画面全体を占めていますが、これが機能するために必要なことではないと思います。

編集:私はあなたの質問を誤解したかもしれないと思います。私のコードの行に沿った何かは、あなたがキーボードビュー全体を自分で偽造している場合です。ツールバーが上に追加された通常のキーボード。

0
frankodwyer