【问题标题】:Properly Subclassing UITextField in swift在 swift 中正确子类化 UITextField
【发布时间】:2016-04-19 08:55:42
【问题描述】:

所以我有这些文本字段,我意识到它们都具有相同的属性,所以我创建了名为“UserInputs”的新类并从UITextField 扩展,除了一件事@987654322 之外一切正常@ 函数不起作用,我的意思是当我专注于它们时它不起作用,我想将它添加到代码中,因为当您专注于我的输入字段时它们会改变边框,我如何正确地从 UITextField 子类化p>

我唯一的问题是函数:

textFieldDidBeginEditing
textFieldDidEndEditing

所以不起作用。

这是我的课堂,一切都会发生:

import Foundation

import UIKit

class RegistrationViewController: UIViewController, UITextFieldDelegate {

@IBOutlet weak var firstName: UserInputs!
@IBOutlet weak var test: UserInputs!

override func viewDidLoad() {
    super.viewDidLoad()
    self.firstName.delegate = self
    self.test.delegate = self
}

}

这是我的子类

class UserInputs: UITextField{

required init(coder aDecoder: NSCoder) {
    super.init(coder: aDecoder)!
    createBorder()
}
func createBorder(){
    let border = CALayer()
    let width = CGFloat(2.0)
    border.borderColor = UIColor(red: 55/255, green: 78/255, blue: 95/255, alpha: 1.0).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
    self.layer.addSublayer(border)
    self.layer.masksToBounds = true
    //print("border created")
}
func textFieldDidBeginEditing() {
    print("focused")
    self.pulseBorderColor()
}
func textFieldDidEndEditing() {
    print("lost focus")
    self.reversePulseBorderColor()
}
func pulseBorderColor(){
    let pulseAnimation = CABasicAnimation(keyPath: "borderColor")
    pulseAnimation.duration = 0.35
    pulseAnimation.fromValue = UIColor(red: 55/255, green: 78/255, blue: 95/255, alpha: 1.0).CGColor
    pulseAnimation.toValue = UIColor(red: 252/255, green: 180/255, blue: 29/255, alpha: 1.0).CGColor
    pulseAnimation.fillMode = kCAFillModeForwards
    pulseAnimation.removedOnCompletion = false
    pulseAnimation.timingFunction = CAMediaTimingFunction(name: kCAMediaTimingFunctionEaseInEaseOut)
    self.layer.sublayers![0].addAnimation(pulseAnimation,forKey: nil)
    }
func reversePulseBorderColor(){
    let pulseAnimation = CABasicAnimation(keyPath: "borderColor")
    pulseAnimation.duration = 0.35
    pulseAnimation.fromValue = UIColor(red: 252/255, green: 180/255, blue: 29/255, alpha: 1.0).CGColor
    pulseAnimation.toValue = UIColor(red: 55/255, green: 78/255, blue: 95/255, alpha: 1.0).CGColor
    pulseAnimation.fillMode = kCAFillModeForwards
    pulseAnimation.removedOnCompletion = false
    pulseAnimation.timingFunction = CAMediaTimingFunction(name:  kCAMediaTimingFunctionEaseInEaseOut)
    self.layer.sublayers![0].addAnimation(pulseAnimation,forKey: nil)
    }
}

当我没有子类并且在我的主类中执行此代码时,此代码有效,但在创建子类焦点函数后停止工作,其他一切正常

主要问题是我想实现

func textFieldDidBeginEditing() {
    print("focused")
}

func textFieldDidEndEditing() {
    print("lost focus")
}

这些在我的文本字段中,所以我不会一遍又一遍地写它

【问题讨论】:

    标签: ios swift uitextfield subclass uitextfielddelegate


    【解决方案1】:

    您的代码中的UITextFieldDelegate 函数看起来有点不对劲。它们应该是:

    func textFieldDidBeginEditing(textField: UITextField) {
        print("focused")
    }
     func textFieldDidEndEditing(textField: UITextField) {
        print("lost focus")
    }
    

    由于您希望UserInputs 对象成为它们自己的代表,因此我也添加了该代码。为了证明这一点,我有以下两个文件:

    ViewController.swift

    import UIKit
    
    class ViewController: UIViewController, UITextFieldDelegate {
    
        var textField: UserInputs!
    
        override func viewDidLoad() {
            super.viewDidLoad()
            textField = UserInputs(frame: CGRectMake(100, 100, 200, 40))
            view.addSubview(textField!)
        }
    }
    

    UserInputs.swift

    import UIKit
    
    class UserInputs: UITextField, UITextFieldDelegate {
    
        required init(coder aDecoder: NSCoder) {
            super.init(coder: aDecoder)!
            delegate = self
            createBorder()
        }
        required override init(frame: CGRect) {
            super.init(frame: frame)
            delegate = self
            createBorder()
        }
        func createBorder(){
            let border = CALayer()
            let width = CGFloat(2.0)
            border.borderColor = UIColor(red: 55/255, green: 78/255, blue: 95/255, alpha: 1.0).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
            self.layer.addSublayer(border)
            self.layer.masksToBounds = true
            //print("border created")
        }
        func textFieldDidBeginEditing(textField: UITextField) {
            print("focused")
        }
        func textFieldDidEndEditing(textField: UITextField) {
            print("lost focus")
        }
    }
    

    【讨论】:

    • 也许可以,但它并没有解决问题,当我编写代码时没有任何建议: textFieldDid... 但是当我在主类中编写它时它给了我建议
    • 这些委托方法属于委托而不属于 UserInputs 类。
    • 还是不行,我把主课贴出来让大家看清楚我在做什么
    • 我用我工作的代码更新了我的答案。
    • 呃,这对我不起作用。嵌入在 UITextField 类中的委托永远不会被调用。有人在这方面取得过成功吗?
    【解决方案2】:

    您可以通过在 UserInput 中调用委托来更改边框

    class UserInputs: UITextField, UITextFieldDelegate{
    
        let border = CALayer()
    
        required init(coder aDecoder: NSCoder) {
            super.init(coder: aDecoder)!
            createBorder()
            self.delegate = self
    
        }
    
        func createBorder(){
            let width = CGFloat(2.0)
            border.borderColor = UIColor(red: 55/255, green: 78/255, blue: 95/255, alpha: 1.0).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
            self.layer.addSublayer(border)
            self.layer.masksToBounds = true
            //print("border created")
        }
    
        func pulseBorderColor(){
            border.borderColor = UIColor.greenColor().CGColor
        }
    
        func normalColor(){
            border.borderColor = UIColor(red: 55/255, green: 78/255, blue: 95/255, alpha: 1.0).CGColor
        }
    
        func textFieldDidBeginEditing(textField: UITextField) {
            print("focused")
            pulseBorderColor()
        }
    
        func textFieldDidEndEditing(textField: UITextField) {
            print("lost focus")
            normalColor()
        }
    }
    

    【讨论】:

      【解决方案3】:

      您的 UITextFieldDelegate 应该保留在您的 RegistrationViewController 中。

      您可以这样做,而不是覆盖委托。 在您的 init 方法中,使用适当的函数向 self 添加一个目标。

      class UserInputs: UITextField {
        override init(frame: CGRect) {
            super.init(frame: frame)
            self.addTarget(self, action: "formatText", for: .editingChanged)
        }
      
        required init?(coder aDecoder: NSCoder) {
            super.init(coder: aDecoder)
            self.addTarget(self, action: "formatText", for: .editingChanged)
        }
      
        func formatText() {
           // Edit self.text here
        }
      //.......//
      }
      

      【讨论】:

      • 这就是我想要的。这样你就不会阻止任何视图在未来实现 MVC,谢谢! :)
      • 这应该是公认的答案。它可以满足 OP 的要求,并且不会干扰委托的使用。
      猜你喜欢
      • 1970-01-01
      • 2023-04-03
      • 1970-01-01
      • 2016-12-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-13
      相关资源
      最近更新 更多