我正在使用 Xcode 7.3.1 在 Swift 中编写一个应用程序以在 iOS 9.3 上运行。 我正在以编程方式创建 UITextFields,但当我单击其中之一时无法让它们接受焦点。 以下是我创建每个 UITextField 的方法:
self.hoursField = UITextField()
self.hoursField!.borderStyle = UITextBorderStyle.Bezel
self.hoursField!.canBecomeFirstResponder()
self.hoursField!.canBecomeFocused()
self.hoursField!.delegate = self
self.hoursField!.enablesReturnKeyAutomatically = true
self.hoursField!.translatesAutoresizingMaskIntoConstraints = false
self.hoursField!.userInteractionEnabled = true
UITextFields 完全出现在我想要的位置,并且看起来完全按照我想要的样子,我只是无法让它们接受焦点,因此我可以编辑字段中的文本。
我正在实现 UITextFieldDelegate 协议中的所有方法,并从所有返回布尔值的方法中返回 true。
谁能解释一下我做错了什么,或者没做什么?
每个文本字段都被创建并添加到 UIView 的自定义子类中,除了 UITextField 之外,该子类还包含几个 UILabel。 这是创建文本字段的自定义视图 init 方法的相关部分:
init(frame: CGRect, charge: (code:String, note:String?, hours:Int)) {
super.init(frame: frame)
// Create the hours UITextField
self.hoursField = UITextField()
self.hoursField!.borderStyle = UITextBorderStyle.Bezel
self.hoursField!.canBecomeFirstResponder()
self.hoursField!.canBecomeFocused()
self.hoursField!.contentVerticalAlignment = UIControlContentVerticalAlignment.Center
self.hoursField!.delegate = self
self.hoursField!.enablesReturnKeyAutomatically = true
self.hoursField!.font = UIFont.systemFontOfSize(14)
self.hoursField!.keyboardType = UIKeyboardType.NumberPad
self.hoursField!.returnKeyType = UIReturnKeyType.Done
self.hoursField!.text = String(charge.hours)
self.hoursField!.textAlignment = NSTextAlignment.Right
self.hoursField!.translatesAutoresizingMaskIntoConstraints = false
self.hoursField!.userInteractionEnabled = true
// Add it to the view
self.addSubview(self.hoursField!)
// Create its layout constraints
let hoursTopMarginConstraint:NSLayoutConstraint = NSLayoutConstraint(item: self.hoursField!, attribute: NSLayoutAttribute.Top, relatedBy: NSLayoutRelation.Equal, toItem: self.codeLabel!, attribute: NSLayoutAttribute.Top, multiplier: 1, constant: 0)
let hoursLeftMarginConstraint:NSLayoutConstraint = NSLayoutConstraint(item: self.hoursField!, attribute: NSLayoutAttribute.Left, relatedBy: NSLayoutRelation.Equal, toItem: self.codeLabel!, attribute: NSLayoutAttribute.Left, multiplier: 1, constant: self.hourFieldIndent)
let hoursRightMarginConstraint:NSLayoutConstraint = NSLayoutConstraint(item: self.hoursField!, attribute: NSLayoutAttribute.Right, relatedBy: NSLayoutRelation.Equal, toItem: self.hoursField!, attribute: NSLayoutAttribute.Left, multiplier: 1, constant: self.hourFieldWidth)
// Add the layout constraints to the view
self.addConstraints([hoursTopMarginConstraint, hoursLeftMarginConstraint, hoursRightMarginConstraint])
我的应用程序的精简版本显示了我遇到的问题,可以从 https://github.com/ThomBrando/TextFieldDemo.git
下载你尝试过吗
self.hoursField!.becomeFirstResponder()
您能给我们更多信息吗?比如你的 UITextfield 的框架是什么?因为我复制了您的代码并且遇到了同样的问题,但是当我为 UITextfield 添加框架时,这对我来说很好。也只是想确保您将文本字段作为子视图添加到其父视图中。
此外,如果您有设备,我建议您尝试一下,模拟器有时会出现错误,并且无法按预期工作
我认为发生这种情况是因为您在禁用键盘的模拟器上进行测试。然后模拟器将使用您计算机的键盘,并且不会显示 iOS 键盘。
您可以尝试在选择 UITextField 时按 Cmd-K 吗?
问题原来是这一行:
let frame:CGRect = CGRect(x: 0, y: totalContentHeight, width: 0, height: 0)
let chargeView:CustomView = CustomView(frame: frame, charge: charge)
因此您的 CustomView 具有零宽度、零高度 - 零大小。因此,它的所有子视图都是不可触摸的。文本字段是其子视图。因此,它们是不可触摸的。它们是可见的,因为 CustomView 不会剪裁到其边界;但它们在他们的超级视图之外,所以它们是不可触摸的。
为了证明这一点,只需将第一行更改为:
let frame:CGRect = CGRect(x: 0, y: totalContentHeight, width: 500, height: 100)
这些不是“正确”的数字,但这并不重要。关键是,您会发现现在可以点击文本字段并输入内容!所以这应该给你足够的线索来开始。
当我以编程方式实现一个文本域时,我所要做的就是实例化该文本域。
let field = UITextField()
设置其委托 let field.delegate = self
extension UIViewController: UITextFieldDelegate {
public func textFieldShouldReturn(textField: UITextField) -> Bool {
self.view.endEditing(true)
return false
}
}
我从未使用过您尝试中的两条线。
.canBecomeFirstResponder
.conBecomeFocused
.enablesReturnKeyAutomatically
我建议删除那些。
然后,如果您试图在点击屏幕上其他任何位置时关闭键盘,我建议将其添加到扩展中,以便您可以将其添加到任何地方。
extension OnboardingPage {
func hideKeyboardWhenTappedAround() {
let tap: UITapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(dismissKeyboard))
view.addGestureRecognizer(tap)
}
然后只需在您想要执行该操作的
hideKeyboardWhenTappedAround()
中拨打 viewDidLoad
即可。
希望有帮助。 :)