【发布时间】:2014-07-26 02:58:31
【问题描述】:
说实话,我什至不知道从哪里开始。我觉得我一直在兜兜转转几个小时尝试不同的事情。
我的问题是如何在 IB 中配置 NSWindowControllers、NSViewControllers 和 NSViews,然后访问层次结构中的每一个以使用单个 NSWindowController 切换 NSViewControllers...
我从 Apple 网站上的这段代码开始,并试图改变它以适应我的情况: https://developer.apple.com/library/mac/samplecode/ViewController/Listings/MyWindowController_m.html#//apple_ref/doc/uid/DTS10004233-MyWindowController_m-DontLinkElementID_12
我有一个小应用程序,它有 2 个视图,需要根据用户交互来回切换。我们称它们为 drop_view 和 table_view。 Drop_view 是在启动时加载的视图。 我的两个视图都配置在单独的 nib 文件中:
RADropViewController.xib
RADropViewController.m
RADropViewController.h
RADropView.m
RADropView.h
RADropViewController.xib
RADropViewController.m
RADropViewController.h
RADropView.m
RADropView.h
每个 nib 都有一个文件所有者、第一响应者、应用程序、视图图标和对象。 File's Owner 设置为控制器类,View Icon 设置为 View 类,Object 图标设置为 View Controller 类。
然后我有一个带有窗口控制器的窗口控制器笔尖。
RAWindowController.xib
RAWindowController.h
RAWindowController.m
nib 的 File Owner 设置为 RAWindowController,Window 设置为 NSWindow,Object 设置为 RAWindowContoller。我在这个笔尖的窗口中也有一个自定义视图,因为在 Apple 示例中有一个 NSView 插座,我在所有研究中都在 stackoverflow 上读到“通常有一个带有主机视图的窗口控制器,用于托管不同的 NSWindowController)。
分店有:
文件的所有者
Outlets
myTargetView -> Custom View
Referencing Outlets
delegate -> Window - Window
窗口 - 窗口
Outlets
delegate -> File's Owner
Referencing Outlets
window -> Window Controller
窗口控制器
Outlets
myTargetView -> Custom View
window -> Window - Window
这是我的 RAWindowcontroller.h
@class RADropViewController, RATableViewController, RAWindowView;
@interface RAWindowController : NSWindowController
{
IBOutlet NSView *myTargetView;
}
@property (nonatomic, assign) NSViewController *myCurrentViewController;
@property (nonatomic, strong) RADropViewController *dropViewController;
@property (nonatomic, strong) RATableViewController *tableViewController;
-(void)changeViewController:(NSInteger)whichViewTag;
- (NSViewController *)viewController;
@property (strong) IBOutlet NSView *myTargetView;
@end
还有我的 RAWindowController.m
#import "RAWindowController.h"
#import "RADropViewController.h"
#import "RATableViewController.h"
@interface RAWindowController ()
@end
@implementation RAWindowController
@synthesize myCurrentViewController, myTargetView;
enum // popup tag choices
{
kDropView = 0,
kTableView,
};
NSString *const kDropViewTitle = @"RADropViewController";
NSString *const kTableViewTitle = @"RATableViewController";
- (id)initWithWindow:(NSWindow *)window
{
self = [super initWithWindow:window];
if (self) {
}
return self;
}
-(void)awakeFromNib{
_dropViewController = [[RADropViewController alloc] initWithNibName:kDropViewTitle bundle:nil];
_tableViewController = [[RATableViewController alloc] initWithNibName:kTableViewTitle bundle:nil];
[self changeViewController:kDropView];
[myTargetView addSubview:[self.myCurrentViewController view]];
[self.window center];
[self.window setContentMaxSize:NSMakeSize(409.0, 295.0)];
[self.window setContentMinSize:NSMakeSize(409.0, 295.0)];
}
-(void)windowWillLoad{
[super windowWillLoad];
}
- (void)changeViewController:(NSInteger)whichViewTag
{
if ([self.myCurrentViewController view] != nil)
{
[[self.myCurrentViewController view] removeFromSuperview];
}
switch (whichViewTag)
{
case kDropView:
{
if (self.dropViewController == nil)
{
_dropViewController = [[RADropViewController alloc] initWithNibName:kDropViewTitle bundle:nil];
}
myCurrentViewController = self.dropViewController;
break;
}
case kTableView:
{
if (self.tableViewController == nil)
{
_tableViewController = [[RATableViewController alloc] initWithNibName:kTableViewTitle bundle:nil];
}
myCurrentViewController = self.tableViewController;
break;
}
}
[myTargetView addSubview:[self.myCurrentViewController view]];
}
- (NSViewController *)viewController
{
return self.myCurrentViewController;
}
这是我的 drop_view 中的一些示例代码,当我想切换到我的 table_view 时调用它们
-(void)showDifferentViewController: (NSViewController *) controller{
_windowController = [[RAWindowController alloc] initWithWindowNibName:@"RAWindowController"];
[_windowController changeViewController:1];
}
所以一切正常,正如我在发布时所期望的那样。 drop_view 被加载,一切看起来都很好。 当我尝试加载 table_view 时,事情开始分崩离析。
这行代码:
[myTargetView addSubview:[self.myCurrentViewController view]];
是问题,至少在表面上是这样。 myTargetView 为零。启动时它不是零,但当我尝试加载新视图时它是零。所以没有新的视图被加载。我的 drop_view 只是呆在那里,什么也没发生。 myTargetView 代表我的主机视图(据我所知)。这是我的 nib 文件中窗口上的自定义视图。您可以在我的 RAWindowController.h 文件中看到它的出口设置,并且该连接对我来说看起来不错。似乎引用丢失可能是由于主机视图被卸载?
我想也许这篇文章救了我: How exactly does an NSView, an NSViewController, and MainMenu.xib fit together?
[self.window.contentView addSubview:self.customViewController.view];
[self.customViewController.view setFrame:[self.window.contentView bounds]];
...但我意识到我的 self.window 对象为零(我假设是因为我的 window 对象设置为 .nib 中的 NSWindowController)。
我有一种感觉,我没有掌握一些关于窗口、控制器、如何配置它们以及以编程方式访问它们的基本知识。 感谢您的任何见解。
【问题讨论】:
标签: nsview nswindowcontroller nsviewcontroller