【问题标题】:Swift: Become First Responder on UITextField Not Working?Swift:成为 UITextField 上的第一响应者不起作用?
【发布时间】: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]:stackoverflow.com/questions/24420873/…

标签: ios swift storyboard uitextfield becomefirstresponder


【解决方案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 刚刚指出的那样,并在模拟器中禁用硬件键盘:

  1. iOS 模拟器 -> 硬件 -> 键盘
  2. 取消选中“连接硬件键盘”

【讨论】:

    【解决方案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 打开键盘。

        【讨论】:

          猜你喜欢
          • 2011-08-21
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-05-25
          • 1970-01-01
          • 2016-11-03
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多