becomeFirstResponder在iOS 8中不起作用

时间:2014-11-24 04:55:08

标签: ios iphone ios7 ios8 ios8.1

我正在使用UITextField的方法becomeFirstResponder来显示键盘。 这适用于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中有什么办法吗?

8 个答案:

答案 0 :(得分:44)

尝试按下面

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

根据Apple,

  

如果当前,响应者对象只成为第一个响应者   响应者可以辞退第一响应者状态(canResignFirstResponder)   并且新的响应者可以成为第一响应者。

     

您可以调用此方法来制作响应者对象,例如查看   急救人员。但是,您应该只在该视图上调用它   是视图层次结构的一部分。如果视图的窗口属性包含   UIWindow对象,它已安装在视图层次结构中;如果它   返回nil,视图与任何层次结构分离。

答案 1 :(得分:13)

Swift 3

这是接受答案的快速3版本。为了让我开始工作,我还不得不加延迟。

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

答案 2 :(得分:3)

我认为您错过了addsubview txtAddNew Mainview

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

   // Open keyboard
  [txtAddNew becomeFirstResponder];

答案 3 :(得分:1)

有时首先让第一个响应者辞职是有帮助的:

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

self.charViewsContainer.addGestureRecognizer(tapGesture)

答案 4 :(得分:0)

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

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

答案 5 :(得分: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委托。

答案 6 :(得分:0)

以防其他人遇到与我相同的问题:

我的IBOutlet已关联UITextField。我错误地在viewDidLoad方法中初始化了这个。也就是[[textField alloc] init];。我删除了这一切,一切都恢复了。

答案 7 :(得分: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()
        }
    }
}

希望这有助于有人遇到同样的问题。