Swift:成为 UITextField 上的第一响应者不起作用?

Posted

技术标签:

【中文标题】Swift:成为 UITextField 上的第一响应者不起作用?【英文标题】:Swift: Become First Responder on UITextField Not Working? 【发布时间】:2014-10-10 19:10:12 【问题描述】:

我在 Storyboard 上创建了一个带有一个 UITextField 的自定义 UIViewController。在viewDidLoad,我将 UITextFIeld 设置为becomeFirstResponder,什么也没发生(没有弹出键盘)。

然后我尝试调用resignFirstResponder(),但它返回错误。接下来,我试图通过使用@Get the current first responder without using a private API 上的代码循环所有子视图来查找first responder 是谁。事实证明,没有一个子视图是第一响应者。

故事板中的我的 ViewController

我的代码

class BLTestViewController: UIViewController, UITextFieldDelegate 

    @IBOutlet var tf: UITextField

    override func viewDidLoad() 
        super.viewDidLoad()

        tf.delegate = self
        tf.becomeFirstResponder()
        // Do any additional setup after loading the view.
    

就这么简单...为什么键盘没有出现!!!我做的一件事是自动布局,但我不确定这是否会影响键盘弹出。

【问题讨论】:

尝试让您的文本字段成为viewWill/DidAppear: 中的第一响应者。 两个都试过了,都不行。 快速想法,我认为您可能仍然在 viewDidAppear 等中调用它为时过早...只是为了测试您是否可以设置调用包含 tf.becomeFirstResponder() 的方法的按钮 --- 这种方式我们可以排除时间问题 @尤金。我认为你是对的,这似乎是 xCode 6 模拟器本身的问题!!!该死的苹果。 见[这个问题][1]。基本按Apple+K[1]:***.com/questions/24420873/… 【参考方案1】:

Swift 4 它对我有用 试试看

override func viewDidAppear(_ animated: Bool) 
    super.viewDidAppear(animated)
    
    textView.becomeFirstResponder()
    

【讨论】:

从调度队列内部执行为我做了这件事。 viewDidAppear 在主线程上运行,即需要延迟,而不是调度到main。如果您已经在主线程上然后分派到主线程,那么您刚刚分派的任何内容都将进入主队列的末尾。我想:DispatchQueue.global(qos: .userInteractive).async 也会解决这个问题,因为它会造成延迟。视图在成为响应者之前必须有一个窗口,并且只能在 视图控制器的 viewWillAppearviewDidAppear 被调用之后发生。因此,任何试图查看响应者之前的尝试都会被覆盖【参考方案2】:

我刚刚通过调用self.tf.becomeFirstResponder() indside viewDidLoad() 函数使用文本字段对其进行了测试,它的工作绝对正常。您需要通过按 command + K 来切换键盘,正如 nflacco 刚刚指出的那样,并在模拟器中禁用硬件键盘:

    ios 模拟器 -> 硬件 -> 键盘 取消选中“连接硬件键盘”

【讨论】:

【参考方案3】:

我认为

class BLTestViewController: UIViewController, UITextFieldDelegate 

@IBOutlet var tf: UITextField

    override func viewDidLoad() 
        super.viewDidLoad()

        tf.delegate = self
        self.focustf()
        // Do any additional setup after loading the view.
    

    func focustf()
    self.tf.becomeFirstResponder()
    

【讨论】:

【参考方案4】:

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

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

【讨论】:

在我的情况下,当用户单击该部分的行时,我需要关注自定义标题部分文本字段。可能吗?我尝试以相同的方式在索引路径中选择行,但它对我不起作用。! @HariNarayanan ,可能会尝试与上面类似,但使用 tableView(_ tableView: UITableView, willDisplayHeaderView view: UIView, forSection section: Int) 这在尝试将第一响应者设置为表格视图单元格中的文本字段时有效。即使在 ViewDidLoad 延迟 5 秒后调用它也无法正确调出键盘。但是第一响应者从这个方法中正确设置。【参考方案5】:

延迟后尝试设置:

DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) 
    textField.becomeFirstResponder()
                

有时错误是渲染视图的时间

【讨论】:

【参考方案6】:

如果您使用的是 iOS 模拟器,请按 Command Shift K 打开键盘。

【讨论】:

以上是关于Swift:成为 UITextField 上的第一响应者不起作用?的主要内容,如果未能解决你的问题,请参考以下文章

Swift 如何让所有 uiTextfield 上的第一响应者辞职

UITextField 没有成为集合视图中的第一响应者

UITextField 不能成为 UITableView 中的第一响应者

使 UITextField 子视图成为 UITableView 中的第一响应者时出错

成为没有动画的第一响应者

iOS - UIButton 成为打开键盘的第一响应者