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
也会解决这个问题,因为它会造成延迟。视图在成为响应者之前必须有一个窗口,并且只能在 视图控制器的 viewWillAppear
或 viewDidAppear
被调用之后发生。因此,任何试图查看响应者之前的尝试都会被覆盖【参考方案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 不能成为 UITableView 中的第一响应者