如何以编程方式创建可编辑的UITextField

时间:2016-08-28 21:28:30

标签: ios iphone swift uitextfield uitextfielddelegate

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

下载的问题

5 个答案:

答案 0 :(得分:0)

你试过吗

self.hoursField!.becomeFirstResponder() 

答案 1 :(得分:0)

当我以编程方式实现texfield时,我所要做的就是实例化texfield。 let field = UITextFeild()设置其委托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即可进行操作。

希望有所帮助。 :)

答案 2 :(得分:0)

您能再给我们一些信息吗?就像你的UITextfield的框架一样?因为我复制了你的代码并且我有同样的问题但是当我为UITextfield添加一个框架时它对我来说很好。还只是想确保将文本字段作为子视图添加到其父视图中。

另外我建议尝试使用某个设备,如果你有一个设备,模拟器有时会出错并且事情无法正常工作

答案 3 :(得分:0)

我认为这是因为您在禁用键盘的情况下在模拟器上测试它。然后,模拟器将使用计算机的键盘,而不会显示iOS键盘。

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

答案 4 :(得分: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)

那些不是"权利"数字,但这并不重要。关键是,你会发现你现在可以点击文本字段并输入它!所以这应该给你足够的线索开始。