NSObject可以作为一个类的两个实例的委托吗?

问题描述:

我有两个的NSTextField,我想使用的每一个相同的方法:NSObject可以作为一个类的两个实例的委托吗?

-(void)controlTextDidChange: (id)sender { 
[label setStringValue:[textfield stringValue]]; 
} 

我想用一个不同的label/textfield夫妇取决于哪个的NSTextField发送消息。是否在sender对象中提供此信息,还是必须创建新委托?

[sender object]是你的textfield,所以得到stringValue很容易。但是,获取相关标签并不是:您需要构建自己的方案来找到它。

一种方法可能是标记文本字段,将它们的tag属性设置为不同的数字。如果设置文本框的标签的第一个标签为1,文本字段的第二个标签2的标签,你可以做这样的事情:

-(void)controlTextDidChange: (id)sender { 
    NSTextField *textfield = [sender object]; 
    NSLabel *label = nil; 
    switch ([textfield tag]) { 
    case 1: label = myLabelOne; break; 
    case 2: label = myLabelTwo; break; 
    } 
    [label setStringValue:[textfield stringValue]]; 
} 
+0

对于'[sender tag]',运行时输出:' - [NSConcreteNotification tag]:发送到实例0x7f9a516dc080'的无法识别的选择器。 'sender'真的是将消息发送给委托的对象吗? – alecail 2012-07-19 11:34:19

+0

@Antoine不,我错了,是'NSNotification'。除非我再次弄错了,不过你应该可以通过调用'[sender object]'来从文本字段中取出文本字段。 – dasblinkenlight 2012-07-19 11:39:28

这是我如何解决它:

-(void)controlTextDidChange: (id)sender { 
    [[[window contentView] 
    viewWithTag:([[sender object] tag] + 100)] 
    setStringValue:[ [sender object] stringValue]]; 

我在接口构建器中将标签的标签设置为值100+关联的NSTextField的标签。 IBOutlet也不需要。

+0

给标签+标签+ 100也可以!无论您选择什么标签方案,诀窍都是从发件人处取出标签,并用它来查找对方组件:我使用'switch',使用'viewWithTag'。无论采用哪种方式,您都可以根据需要为您的委托重复使用多个对象。 – dasblinkenlight 2012-07-19 12:06:36