Какао / Objective-C: рисовать прямоугольник при нажатии кнопки

Привет, люди stackoverflow, я новичок в Какао. У меня XCode 3.1

Ситуация: у меня есть подкласс NSObject: (AppController) с действием, связанным с кнопкой. Чем у меня есть собственный View, связанный с моим подклассом NSView (AppView), в команде drawRect я рисую прямоугольник (все это работает), у меня есть функция AppView.ma - (void) drawIt {..}, которая рисует прямоугольник. А пока я вызвал его в - (void) drawRect ... с помощью [self drawIt]. Это тоже работает.

Теперь я хочу вызвать drawIt при нажатии кнопки. (в AppController.m, когда Action - (IBAction) ... вызывается из-за нажатия кнопки)

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


person Samuel    schedule 18.01.2010    source источник


Ответы (1)


Вам следует прочитать Руководство по рисованию какао Концептуальный материал. Система запрашивает ваше мнение -drawRect:, когда она считает это необходимым. В связи с этим ваш вид можно попросить изобразить в любой момент. Следовательно, вы должны думать об этом с точки зрения «рисования текущего состояния».

Что вам, вероятно, следует сделать (в этой базовой ситуации), это, возможно, дать вашему пользовательскому представлению логическое свойство "drawIt" и заставить действие кнопки переключать это в экземпляре представления. Таким образом if (self.drawIt == YES) вы можете вызвать код для рисования прямоугольника.

Вы всегда должны делать что-то, чтобы «очистить» представление при вызове -drawRect: (например, заполнить все границы белым цветом), а затем рисовать условный материал только в том случае, если условие выполнено.

Пример:

- (void)drawRect:(NSRect)aRect
{
  // Clean up background (we ignore "aRect", drawing entire view at once)
  [[NSColor whiteColor] set];
  NSRectFill([self bounds]);

  // Do we want to draw our magic rect?
  if ([self drawMagicRect])
  {
    [[NSColor redColor] set];
    NSRectFill([self magicRect]);
  }
}
person Joshua Nozzi    schedule 18.01.2010
comment
Спасибо - так что в кнопке - (IBAction) buttonAction ... {я говорю: drawMagicRect = TRUE; поэтому он перезагрузит представление и отобразится прямоугольник, нужно ли мне заботиться о значении по умолчанию drawMagicRects? - person Samuel; 18.01.2010
comment
Вам нужно будет сделать домашнее задание: прочтите документацию по свойствам Objective-C 2.0. Что касается его обновления, рекомендуется обычно вызывать [self setNeedsDisplay: YES] из метода доступа установщика свойства после его изменения. Это сообщит системе, что представление необходимо перерисовать. - person Joshua Nozzi; 18.01.2010
comment
хорошо, я собираюсь немного почитать, но теперь у меня есть основная идея, спасибо ^^ - person Samuel; 18.01.2010
comment
Вы удалили свой первый комментарий, из-за чего мой ответ кажется странным (он был в ответ на то, как мне сделать что-то свойством). Чтобы ответить на ваш второй вопрос, две вещи: во-первых, BOOL - это ДА и НЕТ по соглашению; во-вторых, я считаю, что BOOL по умолчанию имеет значение NO, но вы всегда должны тщательно продумывать инициализацию всех ваших iVars в методах -init ... вашего класса. - person Joshua Nozzi; 18.01.2010
comment
Извините за первый комментарий - я не хотел сначала удваивать публикацию, но потом я также увидел, что это стало странно, поэтому я просто опубликовал новые комментарии ^^ Я должен сказать, что исходит из PHP, где все довольно просто Цель - C для меня не так просто - person Samuel; 18.01.2010
comment
@ Пит: Что ты пробовал? Как это не сработало? Куда вы положили этот код? Он не компилировался? Произошел сбой во время выполнения? Сделал ли он что-то неожиданное или чего-то не ожидал? Помогите нам помочь вам. - person Joshua Nozzi; 12.07.2011