2014-11-24 4 views
13

Я использую метод UITextField, чтобы отображать клавиатуру. Это работает в iOS 7. Но в iOS 8 этот метод не отображает клавиатуру.beFirstResponder не работает в 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?

+1

Я не вижу, чтобы вы добавляли это текстовое поле в любое представление в качестве подзаголовка. –

ответ

36

Попробуйте позвонить becomeFirstResponder, как показано ниже

[txtAddNew performSelector:@selector(becomeFirstResponder) withObject:nil afterDelay:0]; 

Согласно Apple,

Объект Ответчик только становится первым ответчиком, если текущий Ответчик может отмените статус первого ответчика (canResignFirstResponder) , и новый ответчик может стать первым ответчиком.

Вы можете вызвать этот метод, чтобы создать объект-ответчик, например, вид первого ответчика . Однако вы должны вызывать его только в этом представлении, если он является частью иерархии представлений. Если свойство окна вида содержит объект U12WDOWOW , он был установлен в иерархии представлений; если он возвращает нуль, вид отделяется от любой иерархии.

+0

Странно, как это работает, когда [txtAddNew wasFirstResponder] не работает в случаях. В чем разница? – mskw

+0

Так странно ... это действительно работает. – Rishab

0

добавьте эту строку в свой код. я надеюсь, что он будет работать

[txtAddNew performSelectorOnMainThread:@selector(becomeFirstResponder) withObject:nil afterDelay:0.0]; 
3

Я думаю, что вы пропустили addsubview в txtAddNew к Mainview

txtAddNew.tag = 15; 
    [self.view addsubview:txtAddNew]; 

    // Open keyboard 
    [txtAddNew becomeFirstResponder]; 
1

Иногда это помогает первый в отставке первого ответчика:

var tapGesture = UITapGestureRecognizer() 
tapGesture.rac_gestureSignal().subscribeNext { [weak self] (_) -> Void in 
    self?.inputTextField.resignFirstResponder() 
    self?.inputTextField.becomeFirstResponder() 
} 

self.charViewsContainer.addGestureRecognizer(tapGesture) 
+0

это сработало для меня, есть ли какие-либо документы Apple, которые привели вас к этому? – Austin

0

Для прошивки 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.

0

Только в случае, если другие имеют один и тот же вопрос, что и я:

У меня был IBOutlet подключен к моему UITextField. Ошибочно я инициализировал это в моем методе viewDidLoad. То есть, [[textField alloc] init];. Я удалил это, и все снова работало.

9

Swift 3

Вот скор 3 версия принятого ответа. Для меня, чтобы заставить его работать, мне также пришлось добавить задержку.

txtAddNew.perform(
    #selector(becomeFirstResponder), 
    with: nil, 
    afterDelay: 0.1 
) 
0

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() 
     } 
    } 
} 

Надеюсь, это поможет кому-то застрять с той же проблемой.

Смежные вопросы