2016-08-02 49 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 -

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嗎? textField.addTarget(self,action:#selector(self.textChange(_ :)),forControlEvents:.EditingChanged) – ohr

+0

@ohr哦,上帝!是!我正在尋找什麼是錯的!謝謝! –

回答

1

使用默認屬性創建文本字段類,並在視圖控制器中實現,而不是使用nsobject發送文本字段作爲參數:

class baseTextfield: UITextField, UITextFieldDelegate { 


} 

class ViewController: UIViewController{ 

    @IBOutlet weak var dateInsert: UIBaseTextField! 
} 

屬性是文本字段,而不是視圖。

相關問題