调用协议方法两次,Swift

时间:2015-01-13 17:53:18

标签: ios swift delegates protocols

我有子类文件,它使用来自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子类中的第一个方法将被覆盖。

如何在内部使用不同的操作两次使用相同的方法?

1 个答案:

答案 0 :(得分:0)

如果你想让它执行,只需传递它。您需要实现所有委托协议方法,即使它们最终只是传递。例如:

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

     // some other actions

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

     return true
 }

将对象作为自己的代表是危险的做法,并且可能导致参考周期。您应该考虑重构代码以完成不同的任务。