Как отобразить представление из NSViewController? - PullRequest
2 голосов
/ 25 марта 2012

Я новичок в объективе-c, поэтому, пожалуйста, потерпите меня. У меня есть класс, который возвращает изображение с веб-камеры, и я пытаюсь отобразить его на экране. Я вложил в подкласс NSViewController, чтобы получить изображение из класса камеры, установить для него экземпляр NSImageView и установить для вида NSViewController значение NSImageView. Я создал настраиваемое представление в Интерфейсном Разработчике, перетащил объект NSViewController в MainMenu.xib, установив его класс PhotoGrabberController, и перетащил элемент управления из настраиваемого представления в PhotoGrabberController, чтобы установить привязку к его выходу. (Я действительно не знаю, как это работает за кулисами, мне кажется это волшебством). На экране ничего не появляется, и я играл с этим вечно.

В PhotoGrabberController.h

@interface PhotoGrabberController : NSViewController {
    PhotoGrabber * grabber;
    NSImageView* iView;
}
@property (nonatomic, retain) NSImageView* iView;

В PhotoGrabberController.m

@implementation PhotoGrabberController
@synthesize iView,grabber;
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if (self) {

    }
    return self;
}

- (void) awakeFromNib
{
    self = [super init];
    if (self) {
        NSRect rect = NSMakeRect(10, 10, 200, 100);
        iView = [[NSImageView alloc] initWithFrame:rect];
        [iView setImageScaling:NSScaleToFit];
        [iView setImage:[NSImage imageNamed:@"picture.png"]];
        grabber = [[PhotoGrabber alloc] init]; 
        grabber.delegate = (id)self;
        //[grabber grabPhoto]; (This usually sets iView but I removed it and manually set iView to be an image from file above for simplicity)
        [self setView:iView];
    }
}

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

Вопрос

  1. Как мне заставить главное окно показывать изображение?
  2. Можно ли использовать PhotoGrabberController.view вместо создания подкласса представления?
  3. Что не так с моим пониманием того, как все здесь работает? Я потратил много времени, пытаясь понять это, и никуда не попал.
  4. Можете ли вы направить меня на ресурс, где я могу полностью понять, как это работает? Я нашел документацию Apple слишком подробной и толстой. Я просто хочу понять, как окна, представления и контроллеры представления загружаются и взаимодействуют.

1 Ответ

6 голосов
/ 26 марта 2012

Как мне заставить главное окно показывать изображение?

Это работа представления.

Поскольку у вас уже есть вид, вам просто нужно вывести его в окно. Окно непосредственно содержит только одно представление, которое называется представлением содержимого; скорее всего, вы захотите добавить представление контроллера представления как подпредставление представления, которое уже является представлением содержимого, или как подпредставление какого-либо другого представления внука.

Можно ли использовать PhotoGrabberController.view вместо создания подкласса представления?

Они ортогональны. Представление VC - это экземпляр класса представления. Создание класса не имеет ничего общего с использованием экземпляра.

Я не думаю, что создание подкласса представления поможет вам здесь. У вас уже есть два рабочих представления: простой NSView в качестве непосредственного представления VC и NSImageView в нем. Подкласс не требуется, чтобы добавить их к представлению - с представлением изображения внутри него - к окну.

Что не так с моим пониманием того, как все здесь работает?

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

Кроме того, вы начали свой вопрос с «Я новичок в target-c» (sic), но ваш вопрос касается фреймворка Cocoa (в частности, фреймворка AppKit), а не языка Objective-C.

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

Руководство по программированию окна (в частности, «Как работает Windows» ) и Руководство по программированию View (в частности, «Работа с видом» Иерархия»).

...