2010-04-11 3 views
0

У меня есть интерфейс, который имеет NSTextField, NSButton и NSView. Когда я набираю текст в NSTextfield и нажимаю кнопку, я хочу, чтобы текст был нарисован в NSView. Пока у меня все связано и работает, кроме представления.Отображение NSString на пользовательском представлении

Как подключить текст и представление так, чтобы каждый раз, когда я нажимаю кнопку, текст нарисован на вид?

ответ

0
+0

Это решает половину проблемы, но не получить значение в поле зрения, что привлечет его (если вы предлагаете, чтобы вопросник написал IBPlugin для своего пользовательского представления). –

+0

Конечно, вы можете использовать привязки без Interface Builder, но я согласен, что это не отвечает на вопрос OP. –

+0

Не получает значение в представление, которое будет рисовать его? Спасибо, что дал мне еще одну причину никогда не устанавливать Growl. –

1

Как я могу подключить текст и изображение таким образом, что каждый раз, когда я нажимаю на кнопку, текст рисуется в представлении?

Виды делают свой рисунок.

Необходимо отобразить строку, которую нужно нарисовать, а затем установить представление как необходимое для отображения. Вы сделаете это в методе action, к которому вы подключаете кнопку.

Во-первых, ваш пользовательский класс представления должен иметь значение property для значения (строка в этом случае), которое он будет отображать. Из вашего метода действий, который обычно должен быть на объекте controller, отправьте объект вида сообщение setFoo: (при условии, что вы назвали свойство foo). Это заботится о работе: представление теперь имеет значение для отображения.

Работать с двумя задачами еще проще: Отправить a setNeedsDisplay: message, со значением YES.

Все. Метод действия - две строки.

Конечно, поскольку виды рисуют сами, вам также нужен ваш пользовательский вид на на самом деле нарисовать, поэтому вам необходимо реализовать the drawRect: method в этом классе. Он тоже будет коротким; все, что вам нужно сделать, это tell the string to draw itself.

+0

Хорошо, у меня было уже около половины этого места, так что это обнадеживает. Я добавил сообщение setNeedsDisplay в свой метод действий. Однако он все еще не работает, и я на 99% уверен, что он включает то, что вы упомянули в своем последнем абзаце, который я еще не добавил. Вы говорите о вызове метода drawRect: от контроллера? Если да, то каким будет аргумент (NSRect *) dirtyRect, который я бы добавил? – ilovetacos

+0

О, также, в моем классе Controller я создал экземпляр класса NSView, который я подключил к моему представлению. Я делаю всю работу с объектом NSView из этого экземпляра. Это правильный способ сделать это, правильно? – ilovetacos

+0

«Вы говорите о вызове метода drawRect: от контроллера?» Нет. Противоположность: прочитайте первый абзац. Вы должны * реализовать * 'drawRect:' в представлении. –

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 
+0

Обновлено, чтобы отразить изменения – ilovetacos

+0

Это не отвечает на ваш вопрос, поэтому вы должны отредактировать свой вопрос, вместо того чтобы иметь его здесь в качестве ответа. –