如何以编程方式创建可编辑的 UITextField [重复]

问题描述 投票:0回答:5

我正在使用 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

下载
ios iphone swift uitextfield uitextfielddelegate
5个回答
0
投票

你尝试过吗

self.hoursField!.becomeFirstResponder() 

0
投票

您能给我们更多信息吗?比如你的 UITextfield 的框架是什么?因为我复制了您的代码并且遇到了同样的问题,但是当我为 UITextfield 添加框架时,这对我来说很好。也只是想确保您将文本字段作为子视图添加到其父视图中。

此外,如果您有设备,我建议您尝试一下,模拟器有时会出现错误,并且无法按预期工作


0
投票

我认为发生这种情况是因为您在禁用键盘的模拟器上进行测试。然后模拟器将使用您计算机的键盘,并且不会显示 iOS 键盘。

您可以尝试在选择 UITextField 时按 Cmd-K 吗?


0
投票

问题原来是这一行:

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)

这些不是“正确”的数字,但这并不重要。关键是,您会发现现在可以点击文本字段并输入内容!所以这应该给你足够的线索来开始。


0
投票

当我以编程方式实现一个文本域时,我所要做的就是实例化该文本域。

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
即可。

希望有帮助。 :)

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.