15

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

代替テキスト

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

4

5 に答える 5

50

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

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

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

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

ViewControllerのUITextFieldDelegateも実装する必要があります。

@interface YourViewController : UIViewController <UITextFieldDelegate> 

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

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

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

于 2009-07-26T18:25:08.150 に答える
26

やってみました:

[viewReceivingKeys resignFirstResponder];

viewReceivingKeysテキスト入力を受け取っているUIViewはどこですか?

于 2008-12-23T19:29:12.690 に答える
6

Interface Builder で独自のビューを作成する場合は、ビュー コントローラーをテキスト フィールドのデリゲートに設定し、ビュー コントローラーで UITextFieldDelegate から textFieldShouldReturn: を実装します。

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

UITextFieldDelegate textFieldShouldReturn: iphone cocoa ドキュメント内

于 2008-12-23T20:58:36.363 に答える
2

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;
}

ただし、 a を使用している場合UITextView、状況はもう少し複雑になります。UITextViewDelegateおそらく、 Returnキーが、ユーザーが複数行のtextFieldShouldReturn:テキスト入力ダイアログでテキストの編集を停止したいというシグナルであるとは考えるべきではないためです (結局のところ、ユーザーは挿入したいかもしれません)。 Return キーを押して改行します)。

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

ただし、インターフェイスをどのように計画したかによっては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

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

于 2012-02-21T10:49:35.383 に答える
0

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

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

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

そして、そのアバウトボックスのボタンがクリックされると、これを使ってそれを取り除きます:

[self.navigationController dismissModalViewControllerAnimated:YES];

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

編集:あなたの質問を誤解したかもしれません。私のコードの行に沿った何かは、キーボードビュー全体を自分で偽造している場合です。ツールバーが上に追加された通常のキーボードの場合は、ファーストレスポンダーを辞任するのが正しい方法だと思います。

于 2008-12-23T19:31:08.880 に答える