becomeFirstResponder 在 iOS 8 中不起作用

Posted

技术标签:

【中文标题】becomeFirstResponder 在 iOS 8 中不起作用【英文标题】:becomeFirstResponder not working in iOS 8 【发布时间】:2014-11-24 04:55:07 【问题描述】:

我正在使用 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 中有什么方法可以做到吗?

【问题讨论】:

我没有看到您将该文本字段作为子视图添加到任何视图中。 【参考方案1】:

尝试如下调用 becomeFirstResponder

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

根据苹果,

只有当当前响应者对象成为第一个响应者时 响应者可以放弃第一响应者状态(canResignFirstResponder) 并且新的响应者可以成为第一响应者。

您可以调用此方法来使响应者对象(例如视图) 急救人员。但是,您应该只在该视图上调用它,如果它 是视图层次结构的一部分。如果视图的 window 属性持有 UIWindow 对象,它已安装在视图层次结构中;如果它 返回 nil,视图与任何层次结构分离。

【讨论】:

当 [txtAddNew becomeFirstResponder] 在某些情况下不起作用时,这很奇怪。有什么区别? @mskw 可能是因为调用选择器强制resignFirstResponder【参考方案2】:

斯威夫特 3

这是已接受答案的 swift 3 版本。为了让它工作,我还必须添加一个延迟。

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

【讨论】:

【参考方案3】:

我想你错过了addsubview txtAddNewMainview

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

   // Open keyboard
  [txtAddNew becomeFirstResponder];

【讨论】:

【参考方案4】:

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

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

【讨论】:

【参考方案5】:

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

希望这可以帮助遇到同样问题的人。

【讨论】:

【参考方案6】:

有时先让第一响应者辞职会有所帮助:

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


self.charViewsContainer.addGestureRecognizer(tapGesture)

【讨论】:

这对我有用,是否有任何 Apple 文档可以帮助您做到这一点?【参考方案7】:

对于 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 委托。

【讨论】:

【参考方案8】:

以防万一其他人和我有同样的问题:

我有一个IBOutlet 连接到我的UITextField。我错误地在我的viewDidLoad 方法中初始化了它。即[[textField alloc] init];。我删除了这个,一切都恢复了。

【讨论】:

以上是关于becomeFirstResponder 在 iOS 8 中不起作用的主要内容,如果未能解决你的问题,请参考以下文章

在 iOS 6 中,-[UITextField becomeFirstResponder] 在 -viewWillAppear 中不起作用:

IOS 获取文本焦点 主动召唤出键盘(becomeFirstResponder)

UITextView becomeFirstResponder 使用 iOS SDK 8.2 失败

becomeFirstResponder 第二次不显示键盘(ios 6 + 故事板)

ios8 UIAlertView becomeFirstResponder for Password UITextField 不起作用

Xcode 9.3.1 - iOS Swift 4.1 UITextView.becomeFirstResponder 线程 1:EXC_BAD_ACCESS(代码=1,地址=0x4d555458)