我有一个具有NSTextField
,NSButton
和NSView
. 当我在 中输入NSTextfield
内容并按下按钮时,我希望将文本绘制在NSView
. 到目前为止,除了视图之外,我的所有东西都已连接并正常工作。
如何连接文本和视图,以便每次按下按钮时,都会将文本绘制到视图中?
我有一个具有NSTextField
,NSButton
和NSView
. 当我在 中输入NSTextfield
内容并按下按钮时,我希望将文本绘制在NSView
. 到目前为止,除了视图之外,我的所有东西都已连接并正常工作。
如何连接文本和视图,以便每次按下按钮时,都会将文本绘制到视图中?
如何连接文本和视图,以便每次按下按钮时,都会将文本绘制到视图中?
视图自己绘制。
您需要为视图提供要绘制的字符串,然后将视图设置为需要显示。您将在将按钮连接到的操作方法中执行这些操作。
首先,您的自定义视图类需要具有将要显示的值(在本例中为字符串)的属性。从您的操作方法(通常应该在控制器对象上)向视图对象发送一条setFoo:
消息(假设您将属性命名为foo
)。这需要完成第一项工作:视图现在具有要显示的值。
工作二更简单:向视图发送消息setNeedsDisplay:
,带有值YES
。
而已。动作方法是两行。
当然,由于视图是自己绘制的,因此您还需要自定义视图来实际绘制,因此您需要在该类中实现该drawRect:
方法。它也会很短。您需要做的就是告诉字符串自己绘制。
为简单起见,我之前没有提到这一点,但该应用程序还有一个语音元素来说出字符串。程序的这方面工作正常,所以只需忽略任何涉及SpeakAndDraw
该类的消息(它实际上命名错误,只包括一个语音方法,与绘图无关)。
查看.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
扬声器控制器.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