在自定义视图上显示NSString

时间:2010-04-11 16:02:07

标签: objective-c cocoa nsview cocoa-design-patterns

我的界面有NSTextFieldNSButtonNSView。当我在NSTextfield中输入内容并按下按钮时,我希望在NSView中绘制文字。到目前为止,除了视图外,我已将所有内容连接起来并正常工作

如何连接文本和视图,以便每次按下按钮时,文本都会被绘制到视图中?

3 个答案:

答案 0 :(得分:1)

  

如何连接文本和视图,以便每次按下按钮时,文本都会被绘制到视图中?

视图自己绘制。

您需要为视图提供要绘制的字符串,然后将视图设置为需要显示。您可以使用按钮连接的action方法执行此操作。

首先,您的自定义视图类需要为其显示的值(在本例中为字符串)具有property。从您的操作方法(通常应该在controller对象上),向视图对象发送setFoo:消息(假设您将属性命名为foo)。这需要处理第一项工作:视图现在具有显示的值。

工作二更容易:发送视图a setNeedsDisplay: message,其值为YES

就是这样。动作方法有两行。

当然,由于视图会自行绘制,因此您还需要自定义视图实际绘制,因此您需要在该类中实现the drawRect: method。它也会很短;您需要做的就是tell the string to draw itself

答案 1 :(得分:0)

答案 2 :(得分:0)

为了简单起见,我之前没有提到过这个,但应用程序也有一个语音元素来说出字符串。程序的这个方面工作正常,所以只需忽略涉及SpeakAndDraw类的任何消息(它实际上是错误的,只包括一个语音方法,不包括绘图)。

<强> 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