Objective-C может кто-то объяснить, как программно отображать представление - PullRequest
0 голосов
/ 21 ноября 2010

Я просто не понимаю, я хочу отобразить представление в моем приложении, когда пользователь нажимает кнопку.

Я получил это далеко:

NSView* unitMarker = [[NSView alloc] initWithFrame: NSMakeRect( 20.0, 20.0, 80.0, 50.0 ) ];

Как бы я отобразил этот вид на красном фоне?

Спасибо

Ответы [ 4 ]

1 голос
/ 21 ноября 2010

Я дошел до этого:

NSView* unitMarker = [[NSView alloc] initWithFrame: NSMakeRect( 20.0, 20.0, 80.0, 50.0 ) ];

Как бы я отображал этот вид на красном фоне?

Вы бы не стали, потому что обычныйNSView ничего не рисует.

Во-первых, вам нужно создать подкласс NSView, внедрить drawRect: в этом подклассе, чтобы заполнить его границы красным, и создать экземпляр этого подкласса вместо NSView напрямую.

Вы должны прочитать Руководство по программированию представления .

Как бы я отобразил это представление ...

Вы бы не стали.Представление отображает себя, когда это уместно.

Для него никогда не будет уместно рисовать себя, пока вы не добавите его в иерархию представлений .Каждое окно имеет одно, укорененное в его представлении содержимого.Вам необходимо добавить это представление либо в представление содержимого, либо в какое-либо представление-потомок (подпредставление, подпредставление подпредставления и т. Д.) Представления содержимого.

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

1 голос
/ 21 ноября 2010

@ Аарон: он говорит, что хочет сделать это программно. Кроме того, он использует NSView, а не UIView, поэтому учебник для iPhone будет почти неактуальным.

@ Майк: Ваше описание того, что вы хотите сделать, немного расплывчато. У нас есть немного кода для создания, представления, но нет контекста, чтобы точно сказать нам, что вы пытаетесь сделать. Вы хотите, чтобы представление появилось в новом окне или в том же самом? Хотите заменить вид, который уже есть? Мы даже на самом деле не знаем ваш уровень мастерства.

Я предлагаю вам проверить документацию для NSView: http://developer.apple.com/library/mac/#documentation/Cocoa/Reference/ApplicationKit/Classes/NSView_Class/Reference/NSView.html

1 голос
/ 21 ноября 2010

Скажи это вслух 10 раз несколько раз:

Интерфейсный Разработчик - мой друг.

Мне удалось собрать пример проекта, который будет делать то, что ты хочешь сделать примерно за 5 минут.используя Interface Builder как часть процесса.http://www.markdouma.com/developer/ShowWindowWithRedView.zip.

Вы не можете отобразить вид, не поместив его сначала в окно;безусловно, самый простой способ сделать это - перетащить второе окно в Интерфейсном Разработчике, установить его невидимым при запуске, перетащить универсальное настраиваемое представление NSView в Окно, установить его класс равным SRRedView (вашкрасный вид подкласс).Как писал d11wtq, вы переопределяете примитивный метод рисования NSView, как он показывает (хотя лично я предпочитаю NSBezierPath :-P).

В вашем классе контроллера вы определяете IBOutlets, а затем подключаете их в Интерфейсном Разработчике.Они дают вам возможность ссылаться на важные части вашего интерфейса, чтобы вы могли управлять ими программно.

Я добавил один метод IBAction, который вызывается кнопкой в ​​главном окне.Этот метод просто говорит второму окну показывать себя.

- (IBAction)showWindowWithRedView:(id)sender {
    [windowWithRedView makeKeyAndOrderFront:nil];
}

За 8 или более лет, которые я занимался программированием какао, я не думаю, что мне когда-либо приходилось прибегать к ручному созданию окон и представлений.Всегда было намного быстрее просто загрузить другой файл пера, который содержит окна или представления, которые мне нужно отобразить.Использование Interface Builder вместе с Xcode для создания вашего приложения несколько отличается от того, как работают другие IDE.(В частности, когда вы упорядочиваете вещи в Интерфейсном Разработчике, вы генерируете не столько код, сколько создаете экземпляры объектов пользовательского интерфейса, а затем «замораживаете» их в их текущем расположении в архивном файле .nib. При запуске приложения, они возвращаются к жизни. Или, по крайней мере, так я думаю об этом).

0 голосов
/ 21 ноября 2010

Вам необходимо создать подкласс NSView и реализовать drawRect:.

. В этом случае вы просто собираетесь заполнить весь прямоугольник красным.

@interface MyView : NSView {
}
@end


@implementation MyView

-(void)drawRect:(NSRect)dirtyRect {
  [[NSColor redColor] set];
  NSRectFill(dirtyRect);
}

@end

Это очень простой примерэто делает то, что вы хотите, но если вы хотите делать более сложные вещи (добавляя границы (обводки) или рисовать кривые (контуры) и т. д.), то вам нужно изучить все доступные вам классы рисования.

СкоттСтивенсон написал несколько простых в этом учебниках:

http://cocoadevcentral.com/d/intro_to_quartz/ и;http://cocoadevcentral.com/d/intro_to_quartz_two/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...