2010-11-21 1 views
0

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

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

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

Как бы отобразить эту точку зрения с красным фоном?

Благодаря

+4

Купите книгу и изучите основы. Этого пути не будет. –

ответ

0

Вам нужно создать подкласс 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/

1

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

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

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

+0

Просто для справок в будущем, такой ответ должен быть комментарием, а не ответом;) (Комментарии, которые вы делаете другим пользователям, а не ссылку) – d11wtq

+0

Понял, извините, что я новичок здесь. –

1

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

Interface Builder мой друг.

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

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

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

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

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

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

+2

По вопросу «NSRectFill» и NSBezierPath: NSBezierPath более гибкий, но также более типичный, если вы просто хотите заполнить прямоугольник. По умолчанию «NSRectFill» также значительно быстрее, поскольку по умолчанию используется «NSCompositeCopy», тогда как NSBezierPath использует операцию компоновки контекста, которая по умолчанию является «NSCompositeSourceOver». Можно изменить один так, чтобы они были одинаково быстры, но это еще больше печатает; с другой стороны, иногда вам действительно нужно «SourceOver». –

1

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

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

Как бы отобразить эту точку зрения с красным фоном?

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

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

Вы должны прочитать View Programming Guide.

Как бы отобразить эту точку зрения ...

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

Это никогда не будет подходящим для того, чтобы нарисовать себя, пока вы не окажетесь add it to a view hierarchy. Каждое окно имеет один, основанный на своем представлении содержимого. Вы должны добавить это представление либо к представлению содержимого, либо к некоторому представлению потомка (subview, subview subview и т. Д.) Представления контента.

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

+1

Отличная точка зрения об активной пассивной парадигме. Я забыл, это еще одна вещь, которую люди, новые для Какао, склонны делать, - это желание принять слишком активный подход. «Как отобразить это представление», «Как поместить 4 строки в представление таблицы» и т. Д. Это наоборот ... – NSGod

Смежные вопросы