如何从 NSViewController 显示视图?
Posted
技术标签:
【中文标题】如何从 NSViewController 显示视图?【英文标题】:How to display a view from a NSViewController? 【发布时间】:2012-03-25 16:31:28 【问题描述】:我是 Objective-c 的新手,所以请多多包涵。我有一个从网络摄像头返回图片的类,我正在尝试将其显示到屏幕上。我将NSViewController
子类化以从相机类中获取图像并将其设置为实例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 的 applicationDidFinishLaunching
中放置一堆不同的东西,但现在它的设置方式我认为我不需要在其中放置任何东西。
问题
-
如何让主窗口显示图像?
可以使用 PhotoGrabberController.view 代替创建视图子类吗?
我对这里的工作原理的理解有什么问题?我花了很多时间试图弄清楚这一点,但一无所获。
您能否指导我找到一个我可以完全理解其工作原理的资源?我发现 Apple 文档太详细太厚了。我只是想了解窗口、视图和视图控制器是如何加载和交互的。
【问题讨论】:
【参考方案1】:如何让主窗口显示图像?
这是视图的工作。
既然你已经有了一个视图,你只需要把它放到窗口中。一个窗口只直接持有一个视图,称为它的内容视图;最有可能的是,您希望将视图控制器的视图添加为已经是内容视图的视图的子视图,或者作为其他孙子视图的子视图。
使用 PhotoGrabberController.view 代替创建视图子类可以吗?
这些是正交的。 VC 的视图是视图类的instance。创建类与使用实例无关。
我认为创建视图子类不会对您有所帮助。您已经有两个工作视图:一个普通的 NSView 作为 VC 的即时视图,一个 NSImageView 在其中。无需子类即可将这些添加到视图(其中包含图像视图)到窗口。
我对这里的工作原理的理解有什么问题?
您已经错过了视图层次结构的整个概念,以及这样一个层次结构是每个窗口显示其内容的方式。
此外,您的问题以“我是 Objective-c 的新手”(原文如此)开头,但您的问题是关于 Cocoa 框架(特别是 AppKit 框架),而不是 Objective-C 语言。
您能否指导我找到一个我可以完全理解其工作原理的资源?
Window Programming Guide(特别是 “How Windows Work”)和 View Programming Guide(特别是 “Working with the View Hierarchy”)。
【讨论】:
您好,感谢您的详尽回答。我认为我对问题二的措辞不正确。我的意思是问,创建 PhotoGrabberController.view 而不是创建 NSView 子类的实例并使用它有什么区别? PhotoGrabberController.view 只是 NSView 的常规实例吗? @user1267383:你可以在 VC 的 nib 中看到 VC 的视图是什么类型的对象。选择视图并查看大纲检查器。默认情况下,是的,VC 的视图是普通的 NSView。在这种情况下,除了一种方法是在 nib 中创建所有内容,另一种是在代码中创建所有内容之外,没有任何区别。 没有那么彻底,只是一个措辞优美的 RTFM '答案'。代码总是更好。否则,我完全有能力自己解释高级概念。当寻找技术的人不小心点击了这样的“答案”时,这完全是在浪费他们的时间。 @johnrubythecat 我在同一条线上看到了很多来自您的批评:没有准备好复制和粘贴的代码不仅意味着糟糕的答案,而且回答者不知何故对你造成了人身侮辱。放轻松。 @johnrubythecat 事实上,在你自己的十个答案中(实际上并不是不恰当地作为答案发布的问题),你似乎和你批评的人一样有罪。如果你要指责人们“浪费你的时间”,也许你应该自己树立一个更好的榜样。或者向您的医生咨询锂。以上是关于如何从 NSViewController 显示视图?的主要内容,如果未能解决你的问题,请参考以下文章
如何从app delegate访问NSViewController?
交换视图 - NSWindowController 和 NSViewController(s)
Cocoa:NSViewController 视图中的设置器