2014-11-24 4 views
13

Używam metody UITextField jako FirstResponder do wyświetlania klawiatury. Działa to w systemie iOS 7. Jednak w systemie iOS 8 ta metoda nie wyświetla klawiatury.zostaćFirstResponder nie działa w systemie 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]; 

Czy jest jakiś sposób, aby to zrobić w systemie iOS 8?

+1

Nie widzę, żebyś dodawał to pole tekstowe do dowolnego widoku jako podglądu. –

Odpowiedz

36

Spróbuj zadzwonić becomeFirstResponder jak poniżej

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

Według Apple,

Obiekt odpowiadający w stanie tylko pierwszy responder jeśli obecny Responder może zrezygnować z statusu pierwszego respondenta (canResignFirstResponder) , a nowy responder może zostać pierwszym ratownikiem.

Możesz wywołać tę metodę, aby uczynić obiekt odpowiadający, taki jak widok pierwszej odpowiedzi ratownika . Powinieneś jednak wywołać go tylko w tym widoku, jeśli jest on częścią hierarchii widoków. Jeśli właściwość okna widoku zawiera obiekt UIWindow o numerze , został on zainstalowany w hierarchii widoków; jeśli zwróci wartość zero, widok zostanie odłączony od dowolnej hierarchii.

+0

To dziwne, jak to działa, gdy [txtAddNew staje sięFirstResponder] nie działa w przypadkach. Jaka jest różnica? – mskw

+0

Dziwne ... to działa. – Rishab

0

dodaj tę linię do kodu. Mam nadzieję, że to będzie działać

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

myślę przegapiłeś addsubview się txtAddNew do Mainview

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

    // Open keyboard 
    [txtAddNew becomeFirstResponder]; 
1

Czasami pomaga pierwszy zrezygnować pierwszy responder:

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

self.charViewsContainer.addGestureRecognizer(tapGesture) 
+0

to działało dla mnie, czy jest jakaś dokumentacja Apple, która doprowadziła cię do tego? – Austin

0

Dla iOS 9.3, następujące pracował dla mnie :

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 
     } 

Musisz więc upewnić się, że zaimplementowałeś delegata textFieldShouldEndEditing.

0

tylko w przypadku innych mają ten sam problem jak ja:

miałem IBOutlet podłączony do mojego UITextField. Błędnie zainicjowałem to w mojej metodzie viewDidLoad. To jest [[textField alloc] init];. Usunąłem to i wszystko znów działało.

9

Swift 3

Oto szybki 3 wersji zaakceptowanej odpowiedzi. Dla mnie, aby to zadziałało, musiałem również dodać opóźnienie.

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

Swift 4 i iOS 11

W moim przypadku nie mater co starałem, nie byłem w stanie ustawić pierwszy responder dopóki nie próbowałem tego.

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

Mam nadzieję, że to pomoże komuś utknąć z tym samym problemem.

Powiązane problemy