、NSTextField
、NSButton
およびNSView
. に何かを入力しNSTextfield
てボタンを押すと、テキストが に描画されますNSView
。これまでのところ、ビューを除いてすべてが接続され、機能しています。
ボタンを押すたびにテキストがビューに描画されるように、テキストとビューを接続するにはどうすればよいですか?
、NSTextField
、NSButton
およびNSView
. に何かを入力しNSTextfield
てボタンを押すと、テキストが に描画されますNSView
。これまでのところ、ビューを除いてすべてが接続され、機能しています。
ボタンを押すたびにテキストがビューに描画されるように、テキストとビューを接続するにはどうすればよいですか?
ボタンを押すたびにテキストがビューに描画されるように、テキストとビューを接続するにはどうすればよいですか?
ビューは独自の描画を行います。
ビューに描画する文字列を指定してから、表示が必要としてビューを設定する必要があります。これらは、ボタンを接続するアクションメソッドで行います。
まず、カスタム ビュー クラスには、表示する値 (この場合は文字列)のプロパティが必要です。アクション メソッド (通常はコントローラーオブジェクト上にある必要があります) から、ビュー オブジェクトにsetFoo:
メッセージを送信します (プロパティに名前を付けたと仮定しますfoo
)。これでジョブ 1 が処理されます。ビューには、表示する値が含まれています。
ジョブ 2 はさらに簡単です:値を含むsetNeedsDisplay:
メッセージYES
をビューに送信します。
それでおしまい。アクションメソッドは2行。
もちろん、ビューは自分自身を描画するので、実際に描画するにはカスタム ビューも必要なので、そのクラスにメソッドを実装する必要があります。drawRect:
それも短くなります。必要なことは、ストリング自体に描画するように指示することだけです。
簡単にするために、これについては前に触れませんでしたが、このアプリには文字列を読み上げるための音声要素もあります。プログラムのこの側面は正常に動作するため、クラスに関するメッセージは無視してくださいSpeakAndDraw
(実際には名前が間違っていて、speech メソッドのみが含まれており、描画については何も含まれていません)。
View.m
#import "View.h"
@implementation View
@synthesize stringToDraw;
- (id)initWithFrame:(NSRect)frame {
self = [super initWithFrame:frame];
if (self) {
[self setAttributes];
stringToDraw = @"Hola";
}
return self;
}
- (void)drawRect:(NSRect)dirtyRect {
NSRect bounds = [self bounds];
[self drawStringInRect:bounds];
}
- (void)setAttributes
{
attributes = [[NSMutableDictionary alloc] init];
[attributes setObject:[NSFont fontWithName:@"Helvetica"
size:75]
forKey:NSFontAttributeName];
[attributes setObject:[NSColor blackColor]
forKey:NSForegroundColorAttributeName];
}
- (void)drawStringInRect:(NSRect)rect
{
NSSize strSize = [stringToDraw sizeWithAttributes:attributes];
NSPoint strOrigin;
strOrigin.x = rect.origin.x + (rect.size.width - strSize.width)/2;
strOrigin.y = rect.origin.y + (rect.size.height - strSize.height)/2;
[stringToDraw drawAtPoint:strOrigin withAttributes:attributes];
}
@end
SpeakerController.m
#import "SpeakerController.h"
@implementation SpeakerController
- (id)init
{
speakAndDraw = [[SpeakAndDraw alloc] init];
view = [[View alloc] init];
[mainWindow setContentView:mainContentView];
[mainContentView addSubview:view];
return self;
}
- (IBAction)speakText:(id)sender
{
[speakAndDraw setStringToSay:[text stringValue]];
[speakAndDraw speak];
[view setStringToDraw:[text stringValue]];
[view setNeedsDisplay:YES];
NSLog(@"%@", view.stringToDraw);
NSLog(@"%@", [view window]);
}
@end