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]];
}
答
这是我如何解决它:
-(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
对于'[sender tag]',运行时输出:' - [NSConcreteNotification tag]:发送到实例0x7f9a516dc080'的无法识别的选择器。 'sender'真的是将消息发送给委托的对象吗? – alecail 2012-07-19 11:34:19
@Antoine不,我错了,是'NSNotification'。除非我再次弄错了,不过你应该可以通过调用'[sender object]'来从文本字段中取出文本字段。 – dasblinkenlight 2012-07-19 11:39:28