2014-11-24 144 views
13

我正在使用UITextField的方法becomeFirstResponder来显示键盘。 这是在iOS 7中工作。但在iOS 8中,此方法不显示键盘。becomeFirstResponder无法在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

我没有看到你将该文本框添加到任何视图作为子视图。 – 2014-11-24 05:12:50

回答

36

尝试调用becomeFirstResponder像下面

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

按照苹果,

Responder对象才成为第一个响应,如果当前 响应者辞职第一响应者状态(canResignFirstResponder) ,新的响应者可以成为第一响应者。

你可以调用这个方法来创建响应者对象,比如查看第一响应者 。但是,如果 是视图层次结构的一部分,则应该只在该视图上调用它。如果视图的窗口属性包含一个 UIWindow对象,则它已安装在视图层次结构中;如果它 返回nil,则该视图将从任何层次结构中分离出来。

+0

当[txtAddNew becomeFirstResponder]在案例中不起作用时,它是如何工作的很奇怪。有什么不同? – mskw 2017-01-12 20:56:27

+0

太奇怪了......它确实有效。 – Rishab 2017-09-01 13:42:32

0

在您的代码中添加此行。我希望它会工作

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

我想你错过了addsubviewtxtAddNewMainview

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

这对我有用,是否有任何苹果文档,导致你这样做? – Austin 2017-09-18 23:11:17

0

对于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

万一别人有同样的问题,因为我:

我有连接到我的UITextFieldIBOutlet。错误地是我在我的viewDidLoad方法中初始化了这个。那就是,[[textField alloc] init];。我删除了这个,一切都恢复正常。

9

斯威夫特3

这里是SWIFT 3版接受的答案的。对于我来说,我也不得不延误。

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

斯威夫特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() 
     } 
    } 
} 

希望这可以帮助别人坚持相同的问题。

相关问题