2016-01-14 28 views
6

所以我有这些文本框,我才意识到它们都具有相同的属性,所以我创建了一个名为“UserInputs”,并从UITextField扩展新的类,一切工作正常,除了一两件事,UITextFieldDelegate功能没有按” t的工作,我的意思是当我专注于他们这是行不通的,我想在代码中添加它,因为当你把注意力集中在我的输入字段上时,他们会改变边界,我如何恰当地从子类别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") 
} 

这些在我的文本框,所以我不过来写,一遍又一遍

回答

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