キーボードを表示するためにUITextFieldのメソッドのfirstFirstResponderを使用しています。これはiOS 7で機能しますが、iOS 8ではこのメソッドはキーボードを表示しません。
UITextField *txtAddNew = [[UITextField alloc] initWithFrame:CGRectMake(10,10,240, 21)];
txtAddNew.font = [UIFont fontWithName:@"Helvetica" size:16];
txtAddNew.clearButtonMode = UITextFieldViewModeWhileEditing;
txtAddNew.returnKeyType = UIReturnKeyDone;
txtAddNew.delegate = self;
txtAddNew.autocorrectionType = UITextAutocorrectionTypeNo;
txtAddNew.tag = 15;
// Open keyboard
[txtAddNew becomeFirstResponder];
IOS 8でそれを行う方法はありますか?
以下のようにbecomeFirstResponderを呼び出してみてください
[txtAddNew performSelector:@selector(becomeFirstResponder) withObject:nil afterDelay:0];
アップルによると、
現在のレスポンダが最初のレスポンダの状態(canResignFirstResponder)に再署名でき、新しいレスポンダが最初のレスポンダになることができる場合にのみ、レスポンダオブジェクトが最初のレスポンダになります。
このメソッドを呼び出して、ビューなどのレスポンダーオブジェクトを最初のレスポンダーにすることができます。ただし、ビュー階層の一部である場合にのみ、そのビューで呼び出す必要があります。ビューのwindowプロパティがUIWindowオブジェクトを保持している場合、それはビュー階層にインストールされています。 nilを返す場合、ビューは任意の階層から切り離されます。
Swift
これはSwift受け入れられた回答の3バージョンです。私がそれを機能させるには、遅延も追加する必要がありました。
txtAddNew.perform(
#selector(becomeFirstResponder),
with: nil,
afterDelay: 0.1
)
addsubview
、txtAddNew
、Mainview
を逃したと思います
txtAddNew.tag = 15;
[self.view addsubview:txtAddNew];
// Open keyboard
[txtAddNew becomeFirstResponder];
時々それは最初の最初の応答者を辞任するのに役立ちます:
var tapGesture = UITapGestureRecognizer()
tapGesture.rac_gestureSignal().subscribeNext { [weak self] (_) -> Void in
self?.inputTextField.resignFirstResponder()
self?.inputTextField.becomeFirstResponder()
}
self.charViewsContainer.addGestureRecognizer(tapGesture)
IOS 9.3の場合、次の方法でうまくいきました。
private var searchTextFieldShouldReturn = false
override func viewWillAppear(animated: Bool) {
super.viewWillAppear(animated)
self.searchTextFieldShouldReturn = false
self.searchTextField.becomeFirstResponder()
}
override func viewWillDisappear(animated: Bool) {
super.viewWillDisappear(animated)
self.searchTextFieldShouldReturn = true
self.searchTextField.resignFirstResponder()
}
func textFieldShouldReturn(textField: UITextField) -> Bool {
self.searchTextFieldShouldReturn = true
textField.resignFirstResponder()
return true
}
func textFieldShouldEndEditing(textField: UITextField) -> Bool {
return self.searchTextFieldShouldReturn
}
したがって、textFieldShouldEndEditingデリゲートも実装する必要があります。
この行をコードに追加します。私はそれがうまくいくことを願っています
[txtAddNew performSelectorOnMainThread:@selector(becomeFirstResponder) withObject:nil afterDelay:0.0];
他の人が私と同じ問題を抱えている場合に備えて:
IBOutlet
をUITextField
に接続しました。誤ってviewDidLoad
メソッドでこれを初期化していました。あれは、 [[textField alloc] init];
。私はこれを削除し、すべてが再び機能しました。
Swift 4およびiOS 11
私の場合、何を試しても問題はありませんでした。これを試すまで、ファーストレスポンダを設定できませんでした。
func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) {
if cell.isKind(of: YOURTABLEVIEWCELL.self) {
if let yourCell = cell as? YOURTABLEVIEWCELL{
yourCell.yourUiTextField.becomeFirstResponder()
}
}
}
これが誰かが同じ問題で立ち往生するのに役立つことを願っています。