关于objective C:如何从 NSViewController 显示视图?

How to display a view from a NSViewController?

我是 Objective-c 的新手,所以请多多包涵。我有一个从网络摄像头返回图片的类,我正在尝试将其显示到屏幕上。我将 NSViewController 子类化以从相机类中获取图像并将其设置为实例 NSImageView 并将 NSViewController 的视图设置为 NSImageView。我在 Interface Builder 中创建了一个自定义视图,将一个 NSViewController 对象拖到 MainMenu.xib 中,将它的类设置为 PhotoGrabberController,并控制从自定义视图中单击拖动到 PhotoGrabberController 以将其出口绑定设置为视图。 (我真的不知道这在幕后是如何运作的,对我来说这似乎很神奇)。屏幕上什么都没有显示,我一直在玩这个。

在 PhotoGrabberController.h

1
2
3
4
5
@interface PhotoGrabberController : NSViewController {
    PhotoGrabber * grabber;
    NSImageView* iView;
}
@property (nonatomic, retain) NSImageView* iView;

在 PhotoGrabberController.m

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
@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 的 applicationDidFinishLaunching 中放置一堆不同的东西,但现在它的设置方式我认为我不需要在其中放置任何东西。

问题

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

  • How do I get the main window to show the image?

    这是视图的工作。

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

    Is it ok to use PhotoGrabberController.view instead of creating a view subclass?

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

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

    What is wrong with my understanding of how things work here?

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

    另外,您的问题以€?我是 Objective-ca 的新手? (原文如此),但您的问题是关于 Cocoa 框架(特别是 AppKit 框架),而不是 Objective-C 语言。

    Can you direct me to a resource where I can fully understand how this works?

    窗口编程指南(特别是?Windows 如何工作?)和视图编程指南(特别是,使用视图层次结构?)。