2015-01-13 35 views
0

我有使用方法從UITextFieldDelegate協議呼叫協議方法兩次,斯威夫特

class MyTextField: UITextField, UITextFieldDelegate { 
    . . . 
    override func willMoveToSuperview(newSuperview: UIView?) { 
     super.willMoveToSuperview(newSuperview) 

     self.delegate = self  
    } 

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

     // some actions 

     return true 
    } 
} 

在我的ViewController類的子類文件,我使用的輸入字段與我的子類

class ViewController: UIViewController, UITextFieldDelegate { 

    @IBOutlet weak var field: MyTextFieldMask! 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     // Do any additional setup after loading the view, typically from a nib. 

      self.field.delegate = self 

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

     // some other actions 

     return true 
    } 
} 

如果有人添加UITextFieldDelegate協議方法到ViewController類(就像上面的代碼一樣)MyTextField子類中的第一個方法將被覆蓋。

我如何在同一個方法中使用兩次不同的動作?

+0

這不是同一個類,它的MyTextField上方,下方是MyTextFieldMask。 –

回答

0

只要通過它,如果你想它執行。你需要實現所有的委託協議方法,即使它們最終只是傳遞。例如:

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

    // some other actions 

    self.field.textField(self.field, range, string) 

    return true 
} 

使一個對象成爲它自己的代表是一個危險的做法,可能導致引用循環。你應該考慮重構你的代碼,以不同的方式完成你的任務。