2016-08-02 3 views
2

私は適切な日付だけを取るTextFieldを作成しています。今私は私のUITextFieldである同じViewControllerクラスのテキストフィールドの委任とアクションメソッドを使用しているとき、それは正常に動作しています。しかし、私はドラッグアンドドロップでどのプロジェクトでも使用できる再利用可能なコンポーネントのようにする必要があります。 MakeDate.swiftとViewController.swift別の迅速なクラスからのトリガーアクション

MakDate.swift - -

import Foundation 
import UIKit 


class MakeDate: NSObject, UITextFieldDelegate { 

    var textField: UITextField! 
    var string: String! 
    var viewController: UIViewController! 
    let characterset = NSCharacterSet(charactersInString: "") 

    init?(textField: UITextField!) { 
     self.textField = textField 

    } 

    func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool { 

     self.string = string 

     return true 
    } 

    func takeProperDateInput() { 
     textField.addTarget(textField, action: #selector(self.textChange(_:)), forControlEvents: .EditingChanged) 

    } 

    @IBAction func textChange(sender: UITextField) { 

     print("\(sender.text!)") 

     print("\(sender.text!) && \(self.string)") 

     if self.string == "" { 
      if sender.text?.characters.count == 2 { 
       let index = sender.text?.endIndex.advancedBy(-2) 
       sender.text = sender.text?.substringToIndex(index!) 
      } 
      else if sender.text?.characters.count == 5 { 
       let index = sender.text?.endIndex.advancedBy(-2) 
       sender.text = sender.text?.substringToIndex(index!) 
      } 
     } 
     if sender.text?.characters.count == 1 && self.string != "" { 
      if self.string.rangeOfCharacterFromSet(characterset.invertedSet) != nil { 
       let index = sender.text?.endIndex.advancedBy(-1) 
       sender.text = sender.text?.substringToIndex(index!) 
      } 
      else if Int(sender.text!) != 1 && Int(sender.text!) != 0 { 
       sender.text = "0" + sender.text! + "/" 
      } 
     } 
     else if sender.text?.characters.count == 2 && self.string != "" { 
      if Int(string) != 1 && Int(string) != 2 && Int(string) != 0{ 
       let index = sender.text?.endIndex.advancedBy(-1) 
       sender.text = sender.text?.substringToIndex(index!) 
      }else { 
       sender.text = sender.text! + "/" 
      } 
     } 
     else if sender.text?.characters.count == 4 && self.string != "" { 
      if self.string.rangeOfCharacterFromSet(characterset.invertedSet) != nil { 
       let index = sender.text?.endIndex.advancedBy(-1) 
       sender.text = sender.text?.substringToIndex(index!) 
      } 
     } 
     else if sender.text?.characters.count == 5 && self.string != "" { 
      if self.string == "/" { 
       var yearComponent = sender.text?.componentsSeparatedByString("/") 
       let index = sender.text?.endIndex.advancedBy(-2) 
       sender.text = sender.text?.substringToIndex(index!) 
       sender.text = sender.text! + "0" + yearComponent![1] + "/" 
      }else { 
       var yearComponent = sender.text?.componentsSeparatedByString("/") 
       if Int(yearComponent![1]) > 31 { 
        let index = sender.text?.endIndex.advancedBy(-1) 
        sender.text = sender.text?.substringToIndex(index!) 
       }else if Int(yearComponent![1]) > 0 && Int(yearComponent![1]) < 32 { 
        sender.text = sender.text! + "/" 
       }else { 
        let index = sender.text?.endIndex.advancedBy(-1) 
        sender.text = sender.text?.substringToIndex(index!) 
       } 
      } 
     } 
     else if sender.text?.characters.count == 10 && self.string != "" { 
      let index = sender.text?.endIndex.advancedBy(-4) 
      if sender.text?.substringFromIndex(index!).rangeOfCharacterFromSet(characterset.invertedSet) != nil { 
       let index = sender.text?.endIndex.advancedBy(-4) 
       sender.text = sender.text?.substringToIndex(index!) 
      } else { 
       var yearComponent = sender.text?.componentsSeparatedByString("/") 
       if Int(yearComponent![2]) == 0 { 
        let index = sender.text?.endIndex.advancedBy(-4) 
        sender.text = sender.text?.substringToIndex(index!) 
       } 
      } 
     } 
     else if sender.text?.characters.count > 10 && self.string != "" { 
      let index = sender.text?.endIndex.advancedBy(-1) 
      sender.text = sender.text?.substringToIndex(index!) 
     } 

    } 


} 

とViewController.swift - 私は2つのファイルが持っている

import UIKit 

class ViewController: UIViewController, UITextFieldDelegate { 

    @IBOutlet weak var dateInsert: UITextField! 
    var dateMaker: MakeDate! 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     // Do any additional setup after loading the view, typically from a nib. 
     dateMaker = MakeDate(textField: self.dateInsert) 
     self.dateInsert.delegate = self.dateMaker 
     self.dateMaker.takeProperDateInput() 
    } 

    override func didReceiveMemoryWarning() { 
     super.didReceiveMemoryWarning() 
     // Dispose of any resources that can be recreated. 
    } 


} 

を私が手にエラーがunrecognized selector sent to instance

+1

こんにちは!ターゲット内のtextFieldではなく、「self」を持っていてはいけませんか? textField.addTarget(self、action:#selector(self.textChange(_ :))、forControlEvents:.EditingChanged) – ohr

+0

@ohr oh god!はい!私は何がうまくいかないのかを全部捜していた!ありがとうございました! –

答えて

1
です

デフォルトのプロパティでテキストフィールドクラスを作成し、テキストフィールドをパラメータとして送信するnsobjectではなく、ビューコントローラで実装します。

class baseTextfield: UITextField, UITextFieldDelegate { 


} 

class ViewController: UIViewController{ 

    @IBOutlet weak var dateInsert: UIBaseTextField! 
} 

プロパティは、ビューではなくテキストフィールドのものです。