Objective c 如何从NSViewController显示视图?

Objective c 如何从NSViewController显示视图?,objective-c,macos,cocoa,nsimageview,nsviewcontroller,Objective C,Macos,Cocoa,Nsimageview,Nsviewcontroller,我是objective-c的新手,请耐心听我说。我有一个从网络摄像头返回图片的类,我正在尝试将其显示到屏幕上。我将NSViewController子类化,以从camera类获取图像,并将其设置为实例NSImageView,并将NSViewController的视图设置为NSImageView。我已经在Interface Builder中创建了一个自定义视图,将NSViewController对象拖到MainMenu.xib中,将其类设置为PhotoGrabberController,然后单击控件

我是objective-c的新手,请耐心听我说。我有一个从网络摄像头返回图片的类,我正在尝试将其显示到屏幕上。我将
NSViewController
子类化,以从camera类获取图像,并将其设置为实例
NSImageView
,并将
NSViewController
的视图设置为
NSImageView
。我已经在Interface Builder中创建了一个自定义视图,将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];
    }
}
我曾在AppDelegate的
applicationdFinishLaunching
中尝试过放一些不同的东西,但就目前的设置方式而言,我认为我不需要在其中放任何东西

问题:
  • 如何获得显示图像的主窗口
  • 使用PhotoGrabberController.view而不是创建视图子类可以吗
  • 我对这里的工作原理的理解有什么问题?我花了很多时间试图弄明白这一点,但一无所获
  • 你能告诉我一个资源,在那里我可以完全理解它是如何工作的吗?我发现苹果的文档太详细太厚了。我只想了解窗口、视图和视图控制器是如何加载和交互的
  • 如何获得显示图像的主窗口

    这是视图的工作

    因为你已经有了一个视图,你只需要把它放到窗口中。一个窗口只直接包含一个视图,称为其内容视图;最可能的情况是,您希望将视图控制器的视图添加为已经是内容视图的视图的子视图,或者添加为其他某个孙视图的子视图

    使用PhotoGrabberController.view而不是创建视图子类可以吗

    这些是正交的。VC的视图是视图类的实例。创建类与使用实例无关

    我不认为创建一个视图子类会对您有所帮助。您已经有两个工作视图:一个普通NSView作为VC的即时视图,另一个NSImageView在其中。不需要子类将这些添加到视图中,将其中的图像视图添加到窗口中

    我对这里的工作原理的理解有什么问题

    您忽略了视图层次结构的整个概念,以及这样一个事实,即这样的层次结构是每个窗口显示其内容的方式

    另外,您的问题是以“我是objective-c的新手”(原文如此)开始的,但您的问题是关于Cocoa框架(特别是AppKit框架),而不是objective-c语言

    你能告诉我一个资源,在那里我可以完全理解它是如何工作的吗


    (特别地,)和(特别地,)。

    嗨,谢谢你的详尽回答。我想我的第二个问题用词不对。我想问的是,创建PhotoGrabberController.view而不是创建NSView子类的实例并使用它有什么区别?PhotoGrabberController.view只是NSView的常规实例吗?@user1267383:您可以看到VC的nib中VC的视图是什么类型的对象。选择视图并在大纲检查器中查看。默认情况下,VC的视图是普通视图。在这种情况下,除了一种方法是在nib中创建所有内容,另一种方法是在代码中创建所有内容,没有那么彻底,只是一个措辞巧妙的RTFM“答案”。代码总是更好。否则,我完全有能力自己解释高级概念。当有人在寻找一种技术时,无意中点击了这样一个“答案”,这完全是在浪费他们的时间。@johnrubytect我看到过很多来自你的批评,都是这样的:没有现成的复制粘贴代码,这不仅意味着答案不好,而且回答者不知何故也会对你造成个人侮辱。放轻松点。@johnrubytecat事实上,在你自己的十个答案中(那些不是作为答案不恰当地张贴的问题),你似乎和你批评的人一样有罪。如果你想让人们指责你“浪费时间”,也许你应该自己树立一个更好的榜样。或者向你的医生要锂。