编辑时如何更改 UITextField

Posted

技术标签:

【中文标题】编辑时如何更改 UITextField【英文标题】:How to Change UITextField When Editing 【发布时间】:2017-01-03 19:24:58 【问题描述】:

我的视图控制器中有多个 UITextField,它也是一个文本字段委托。出于某种原因,以下代码仅在您在未选择任何文本字段后选择文本字段时才有效。如果我在文本字段之间切换,那么我要离开的文本字段会发生变化,但我现在正在编辑的文本字段不会变为红色。我调试并发现即使在两者之间切换时也会调用这两种方法,但由于某种原因,它只是没有为您现在正在编辑的方法设置颜色。任何帮助是极大的赞赏。谢谢!

func textFieldDidBeginEditing(_ textField: UITextField) 
    self.setTextBorder(textField: textField, color: UIColor.red)


func textFieldDidEndEditing(_ textField: UITextField) 
     self.setTextBorder(textField: textField, color: UIColor.lightGray)


func setTextBorder(textField: UITextField, color: UIColor) 
    let border = CALayer()
    let width = CGFloat(2.0)
    border.borderColor = color.cgColor
    border.frame = CGRect(x: 0, y: textField.frame.size.height - width, width:  textField.frame.size.width, height: textField.frame.size.height)
    border.borderWidth = width
    textField.layer.addSublayer(border)
    textField.layer.masksToBounds = true

编辑

我现在创建了一个自定义类来测试,看看问题是否在于我不断添加子层。我得到相同的结果。这是我制作的自定义文本字段类:

class SpecialTextField: UITextField 

    var currentBorder: CALayer?

    func setTextBorder(color: UIColor) 
        let border = CALayer()
        let width = CGFloat(2.0)
        border.borderColor = color.cgColor
        border.frame = CGRect(x: 0, y: self.frame.size.height - width, width:  self.frame.size.width, height: self.frame.size.height)
        border.borderWidth = width
        if (currentBorder == nil) 
            self.layer.addSublayer(border)
            self.layer.masksToBounds = true

         else 
            self.layer.replaceSublayer(self.currentBorder!, with: border)
        
        self.currentBorder = border
    


【问题讨论】:

当您来回改变焦点时,您会不断向给定文本字段添加越来越多的图层。 @rmaddy 是的。但是,我不认为当该方法起作用时应该会起作用。 @rmaddy 我已经用我试图避免重复添加更多层的内容更新了这个问题。结果相同。 @Kendel 你想要什么?当用户开始输入时,边框颜色为红色,当离开该文本文件时,其边框颜色变为灰色?如果您想这样做,请按照我的回答***.com/questions/41453124/… 只需根据需要更改颜色即可。在这个答案中,我只设置了底部的边框颜色,所以你必须设置所有边 @JeckyModi 感谢您的想法,但我正在做同样的事情,但它不起作用。您只是直接从文本字段中使用插座,而不是使用委托方法。结果相同。 【参考方案1】:

你应该改变文本颜色

func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool
    
       // textfield.backgrounColor = UIColor.yourselectedcolor
        return true
    

然后在 endEditing 委托方法中恢复颜色。

【讨论】:

那没有帮助。这样就可以在他们开始输入字符时改变背景。无论如何,同样的问题仍然存在。出于某种原因,在文本视图之间切换时会发生一些奇怪的事情,我无法更改图层。 你在使用任何类型的键盘库吗?在你的项目中处理键盘? 我认为如果函数正在调用但 UI 当前未更新,您应该尝试调度。【参考方案2】:

为了设置初始边框颜色,我使用了viewDidLayoutSubviews(),这导致了问题。它覆盖了我在编辑期间更改的图层。

【讨论】:

以上是关于编辑时如何更改 UITextField的主要内容,如果未能解决你的问题,请参考以下文章

当我在 iframe 中编辑时,如何自动更改 Html 页面的内容

如何在单击按钮操作时更改图像

为啥当我编辑并保存对一个帖子的更改时,所有其他帖子都会进行相同的更改?我该如何解决?我正在使用 laravel 8

数据更改时如何更新 UI?

在 mfc 中单击按钮时更改编辑框内容

SwiftUI - 列表编辑模式 - 如何更改删除按钮标题?