Правильно подклассы UITextField в swift

так я эти текстовые поля, я понял, что все они имеют одинаковые свойства, поэтому я создал новый класс под названием "UserInputs" и UITextField, все работает правильно, кроме одного, UITextFieldDelegate функции не работают, я имею в виду, когда я фокусируюсь на них, это не работает, я хочу добавить его в код, потому что, когда вы фокусируетесь на моих полях ввода, они меняют границу, как мне правильно подкласс из UITextField

единственные проблемы, которые у меня есть, что функции:

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")
}

это в моей textfields, поэтому я не пишу его снова и снова

3 ответов


похоже UITextFieldDelegate функции, которые у вас есть в коде, немного выключены. Они должны быть:

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

и так как вы хотите UserInputs объекты, чтобы быть их собственными делегатами, я добавил этот код тоже. Чтобы продемонстрировать это, у меня есть следующие файлы:

ViewController.Свифт!--11-->

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.Свифт!--11-->

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")
    }
}

ваш UITextFieldDelegate, вероятно, должен оставаться в вашем RegistrationViewController.

вместо переопределения делегата, вы можете сделать это. В вашем методе init добавьте цель к себе с соответствующей функцией.

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
  }
//.......//
}

вы можете изменить границу, вызвав делегат в 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()
    }
}