2012-04-09 5 views
0

私はUITableFieldを含むいくつかのカスタムUITableViewCellを保持するUITableViewを実装しています。UITextField(UITableViewCellサブクラス内の)の2番目のタップが予期せずキーボードを閉じます

いくつかのイベントでキーボードが消えてしまいがちな大抵の人とは違って、私はいつもそれを表示したいと思っています。 問題は、UITextFieldの最初のタップが問題なく表示されるようにすることです。しかし、もう一度タップすると、現在表示されているキーボードは消えます。

さらに、別の関連する問題は、UITextField内のカーソルの位置を変更できないことです。 カーソルの現在の位置を変更するためにUITextFieldでタップを保持すると、虫眼鏡が期待どおりにポップアップします。しかし、いったんタップしてしまえば、キーボードはすぐに閉じます。

この問題を解決するにはどうすればよいですか?

- (void)viewDidLoad 
{ 
    ... 
    TagDetailCell *cell1 = [[[NSBundle mainBundle] loadNibNamed:@"TagDetailCellView" owner:self options:nil] lastObject]; 
    TagDetailCell *cell2 = [[[NSBundle mainBundle] loadNibNamed:@"TagDetailCellView" owner:self options:nil] lastObject]; 
    TagDetailCell *cell3 = [[[NSBundle mainBundle] loadNibNamed:@"TagDetailCellView" owner:self options:nil] lastObject]; 
    self.cells=[NSArray arrayWithObjects:cell1, cell2, cell3, nil]; 
    ... 
} 

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    UITableViewCell *cell=[self.cells objectAtIndex:indexPath.row]; 
    cell.selectionStyle=UITableViewCellSelectionStyleNone; 

    switch (indexPath.row) { 
     ... 
     ((TagDetailCell*)cell).fieldLabel.text= ...; 
     ((TagDetailCell*)cell).fieldValue.clearButtonMode=UITextFieldViewModeWhileEditing; 
     ((TagDetailCell*)cell).fieldValue.text=...; 
     [((TagDetailCell*)cell).fieldValue addTarget:self action:@selector(textFieldChanged:) forControlEvents:UIControlEventEditingChanged]; 
     ... 
    } 
    return cell; 

} 

私はUITextFieldの代理人を実装しませんでした。したほうがいい?

答えて

1

私は愚かでした。私はUITextFieldのをサブクラス化し、コピー/貼り付けのテキストからユーザーを防ぐために、次のメソッドをオーバーライドします。

- (BOOL)canPerformAction:(SEL)action withSender:(id)sender  
{  
    [UIMenuController sharedMenuController].menuVisible = NO; //do not display the menu 
    [self resignFirstResponder];      //do not allow the user to selected anything 
    return NO; 
} 

キーボード解雇の問題は[self resignFirstResponder]の呼び出しから来ました。したがって、それを削除すると、問題が解決されます。

0

UIViewControllerの方法disablesAutomaticKeyboardDismissalをドキュメントで確認してください。一方の入力ビューを望んでいるコントロールから を変更するときに、現在の入力画面(通常はシステムキーボード)の解任 を許可または禁止するサブクラスでは、この方法

上書き:アップルのドキュメントのために引用
そうではありません。 通常の状況では、ユーザーが 入力ビューを必要とするコントロールをタップすると、システムは自動的にそのビューを表示します。入力ビューを必要としない コントロールをタップすると、現在の入力ビューが終了することがありますが、すべての場合に表示されるわけではありません。これらの未解決のケースで のメソッドをオーバーライドすると、 ビューを閉じることができます。または、このメソッドを使用して、ビューが 以外の場合は破棄されないようにすることができます。

+0

ありがとうございました。私は以前これを知らなかった。しかし、キーボードは 'disablesAutomaticKeyboardDismissal'で' YES'を返しても消えてしまいます。プレゼンテーションスタイルを 'UIModalPresentationFormSheet'に設定することも役に立ちません。 –

+0

'disablesAutomaticKeyboardDismissal'が正しく呼び出されていることを確認しようとしましたが、この関数はまったく呼び出されません。何か案が? –

+0

'UITextField'のデリゲートをビューコントローラに設定してみてください。 – Gobot

関連する問題