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

20
Tejas Bharambe 24 Ноя 2014 в 07:55
1
Я не вижу, чтобы вы добавляли это текстовое поле в какое-либо представление в качестве подпредставления.
 – 
Kris Gellci
24 Ноя 2014 в 08:12

8 ответов

Лучший ответ

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

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

Согласно Apple,

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

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

48
thavasidurai 24 Ноя 2014 в 08:12
Странно, как это работает, когда [txtAddNew beFirstResponder] не работает в случаях. В чем разница?
 – 
mskw
12 Янв 2017 в 23:56
Вероятно, потому что вызов селектора вызывает resignFirstResponder.
 – 
Pedro Paulo Amorim
10 Апр 2020 в 20:02

Swift 3

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

txtAddNew.perform(
    #selector(becomeFirstResponder), 
    with: nil, 
    afterDelay: 0.1
)
17
Jacob Arvidsson 19 Дек 2016 в 12:29

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

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

   // Open keyboard
  [txtAddNew becomeFirstResponder];
3
Anbu.Karthik 24 Ноя 2014 в 08:16

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

[txtAddNew performSelectorOnMainThread:@selector(becomeFirstResponder) withObject:nil afterDelay:0.0];
1
Sport 24 Ноя 2014 в 08:12

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

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

self.charViewsContainer.addGestureRecognizer(tapGesture)
0
Antoine 13 Апр 2015 в 11:30
Это сработало для меня, есть ли документация Apple, которая привела вас к этому?
 – 
Austin
19 Сен 2017 в 02:11

Для 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.

0
Zoltan Varadi 8 Апр 2016 в 11:33

На всякий случай, если у других такая же проблема, как у меня:

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

0
apolo 27 Май 2016 в 19:07

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

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

1
Derek Hierholzer 13 Фев 2018 в 22:02