2016-01-14 6 views
6

Так я эти текстовые поля, что я понял, что все они имеют то же свойство, поэтому я создал новый класс под названием «UserInputs» и простирался от UITextField, все работает нормально за исключением одной вещи, UITextFieldDelegate функции Безразлично» я работаю, я имею в виду, когда я сосредотачиваюсь на них, он не работает, я хочу добавить его в код, потому что, когда вы фокусируетесь на моих полях ввода, они меняют границу, как правильно подклассы от UITextFieldПравильно подклассы 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 так я не пишу его снова и снова

ответ

8

Похоже, что 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") 
    } 
} 
+0

может быть, но это не решает проблему, когда я пишу код не существует никаких намеков на: textFieldDid ... но когда я пишу это в основном классе это дает мне советы – nikagar4

+1

Этим методы делегируют принадлежат делегату а не в классе UserInputs. –

+0

он все еще не работает, я опубликую основной класс, чтобы вы могли полностью увидеть, что я делаю – nikagar4

0

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

Ваш 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 
    } 
//.......// 
} 
+0

Вот что я искал. Таким образом, вы не блокируете какой-либо вид реализации MVC в будущем, спасибо! :) –

+0

Это должен быть принятый ответ. Он выполняет то, что хочет OP, и это не мешает использованию делегатов. – Grimxn

 Смежные вопросы

  • Нет связанных вопросов^_^