0

NSTextViewのいくつかのインスタンスを含むNSViewがあります。各インスタンスのコンテンツ(文字列)を取得したいと思います。これまでのところ、私はこれを持っています(このコードはコンパイルされません):

for(NSView *view in [self subviews]) {
    NSLog(@"class: %@ ", [view className]);
if([view isKindOfClass:[NSTextView class]])
    NSLog(@"[view string] %@",[view string]);}

この時点で、NSTextViewのインスタンスであるstringメッセージを送信できると期待していますが、次のようになります。view

Error message: No visible @interface for 'NSView' declares the selector 'string'

私のエラーはどこにありますか?

4

1 に答える 1

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

編集:私たちが「ダックタイピング」と呼ぶものについて言及します...それがあなたが期待するクラスであるかどうかではなく、送信したいセレクターに応答するかどうかをオブジェクトに尋ねることを検討するかもしれません(それがアヒルのように鳴く場合、それはアヒル...)。

for(NSView *view in [self subviews]) {
  NSLog(@"class: %@ ", [view className]);
  if([view respondsToSelector:@selector(string)]) {
    NSLog(@"[view string] %@",[view performSelector:@selector(string)]);
  }
}
于 2012-07-05T21:39:40.157 に答える