我有一个NSView,其中包含几个NSTextView实例。 我想获取每个实例的内容(字符串)。 到目前为止,我有这个(这段代码没有编译):
for(NSView *view in [self subviews]) {
NSLog(@"class: %@ ", [view className]);
if([view isKindOfClass:[NSTextView class]])
NSLog(@"[view string] %@",[view string]);}
此时,我希望能够将string
消息发送到view
,这是NSTextView的一个实例,但是:
Error message: No visible @interface for 'NSView' declares the selector 'string'
我的错误在哪里?
答案 0 :(得分:0)
你可以只做一个简单的演员来获得编译器的认可。您可以使用局部变量或更复杂的内联强制转换来执行此操作:
for(NSView *view in [self subviews]) {
NSLog(@"class: %@ ", [view className]);
if([view isKindOfClass:[NSTextView class]]) {
NSTextView *thisView = (NSTextView *)view;
NSLog(@"[view string] %@",[thisView string]);
}
}
或
for(NSView *view in [self subviews]) {
NSLog(@"class: %@ ", [view className]);
if([view isKindOfClass:[NSTextView class]])
NSLog(@"[view string] %@",[(NSTextView *)view string]);
}
编辑:我会提到我们所谓的“Duck Typing”...你可能会考虑询问对象是否响应你要发送的选择器,而不是它是你期望的类(如果它像鸭子一样嘎嘎叫,它是一只鸭子......)。
for(NSView *view in [self subviews]) {
NSLog(@"class: %@ ", [view className]);
if([view respondsToSelector:@selector(string)]) {
NSLog(@"[view string] %@",[view performSelector:@selector(string)]);
}
}