如何遍历子视图以获取NSTextViews的文本

时间:2012-07-05 21:26:40

标签: cocoa nstextview metaclass

我有一个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'

我的错误在哪里?

1 个答案:

答案 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)]);
  }
}