2016-12-06 98 views
0

例如,我具有符合一个UITextFieldDelegate协议,并从该协议继承的方法的视图控制器..,委托对象如何知道调用委托对象上的WHICH方法?

func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, 
        replacementString string: String) -> Bool { 
     // do some stuff... 
     return true 
    } 

在main.storyboard文件,我控制拖着TextField对这个视图控制器,并点击'委托'让项目知道我的视图控制器现在是这个文本字段的代表。

现在...我知道这个视图控制器现在在我的UITextField中称为“委托”属性,但在我的视图控制器中,我有多个方法和属性在我的文本字段。

如何知道文本字段作为textField(_:shouldChangeCharactersIn:replacementString)函数中的第一个参数传入?与任何其他随机无关的功能相反?

由于

加成相关的问题 在我的视图控制器(所述的UITextField的代表),有一个@IBAction目标函数,其源是相同的文本字段输入对象。现在...我在该IBAction函数中具有功能,基本上可以在屏幕上输入输入值的输入UPON编辑内容。

但是,使用这个新的委托函数,我实现了一些功能,如果有两个相同的字符,则不会更改输入的值。当我运行我的应用程序时,我可以看到,因为委托功能正在工作,当两个相同的数字在文本字段中时,该值不会在文本字段中更新,因此,@IBAction函数甚至不会被调用(或者至少没有任何东西印在控制台上)。

这表明,对我来说,委托函数优先于@IBAction函数。

只需寻找关于该观察的真实或错误答案。谢谢!

+0

你的文本字段将调用它必须调用的委托方法(所以它可以是所有这些方法)。每种方法都有不同的目的。如果你只需要使用'textField(_:shouldChangeCharactersIn:replacementString)',那么你只能实现这个委托方法。 – Randy

+0

如果你想开始实施苹果的东西(iOS,MacOS,tvOS等),你必须学习更多关于[委托](https://developer.apple.com/library/content/documentation/General/ Conceptual/DevPedia-CocoaCore/Delegation.html),因为它是这些技术中使用的基本模板 – Randy

回答

1

里面UITextField将代码等同于:

self.delegate?.textfield(self, shouldChangeCharactersIn: rangeThatChanged, replacementString: stringThatChanged) 

所以,文本字段代码调用它代表的特定功能,传递所需的参数,包括对自身的引用。这与在对象引用上调用任何函数没有什么不同。

对于您的'奖金问题',代表功能的名称是应该 ChangeCharactersIn。此函数通过返回true或false来指示更改是否发生。如果它返回false,则更改将被丢弃。如果没有改变,则变化动作不被调用。

+0

优秀的答案谢谢。还有一个跟进问题 - 为什么使用将对象设置为另一个对象的委托的过程,我们何时可以使用@IBActions?例如,我在IB看到,我可以选择从文本字段到视图控制器建立一个名为“编辑开始”的IBAction。然后我可以创建一个自定义函数来执行xyz。但也有一个名为“textFieldDidBeginEditing”的委托方法...这两个不会做同样的事情吗?委托方法的唯一区别是由Apple编写并具有预设功能? – user7024499

+0

所有'@ IBAction'函数都具有相同的签名。基本上'functionName(sender:UIView) - > Void'一个IBAction不能接受任何其他参数并且不返回一个值。您将不得不问苹果为什么代理和UITextField的操作之间存在重叠的功能;我个人怀疑设置一个'委托'属性比添加多个动作处理器更简单(并且仍然必须为不能作为动作处理器的事物设置委托) – Paulw11

+0

谢谢,我认为这样回答了这个问题。因此,为什么要使用委托而不是IBAction可能有两个原因:(1)委托可以执行的一些方法不是每个说法的“操作”,它们更像是请求信息的方法。就像停止接受任何字符的输入一样,这不像测试值那么简单。 (2)当你开始添加多个动作处理程序时,使用IBActions会变得很沉重 – user7024499

1

documentation该方法规定:

文本字段调用此方法,每当用户操作导致它的文本改变。

因此,当用户操作导致的UITextField的文本改变,给出UITextField代码检查UITextField对象是否具有代表,而且,如果这样做,该委托对象是否实现textField(_:shouldChangeCharactersIn: replacementString:)。如果是这样,UITextField调用方法,传递UITextField对象作为第一个参数。