- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
说实话,我什至不知道从哪里开始。我觉得我已经在原地转了几个小时尝试不同的事情。
我的问题是如何在 IB 中配置 NSWindowControllers、NSViewControllers 和 NSViews,然后访问层次结构中的每个 Controller 以使用单个 NSWindowController 切换 NSViewControllers...
我从苹果网站上的这段代码开始,并试图改变它以适应我的情况: https://developer.apple.com/library/mac/samplecode/ViewController/Listings/MyWindowController_m.html#//apple_ref/doc/uid/DTS10004233-MyWindowController_m-DontLinkElementID_12
我有一个小应用程序,有 2 个 View ,需要根据用户交互来回切换。我们将它们称为 drop_view 和 table_view。Drop_view 是启动时加载的 View 。我的两个 View 都配置在单独的 nib 文件中:
RADropViewController.xib
RADropViewController.m
RADropViewController.h
RADropView.m
RADropView.h
RADropViewController.xib
RADropViewController.m
RADropViewController.h
RADropView.m
RADropView.h
每个 Nib 都有一个文件所有者、第一响应者、应用程序、 View 图标和对象。文件的所有者设置为 Controller 类, View 图标设置为 View 类,对象图标设置为 View Controller 类。
然后我有一个带有窗口 Controller 的窗口 Controller Nib 。
RAWindowController.xib
RAWindowController.h
RAWindowController.m
Nib 的文件所有者设置为 RAWindowController,窗口设置为 NSWindow,对象设置为 RAWindowContoller。我在这个 Nib 的窗口中也有一个自定义 View ,因为苹果示例中有一个 NSView 导出,并且我在所有研究中在 stackoverflow 上读到“通常有一个带有主机 View 的窗口 Controller ,用于托管不同的 NSWindowController)。
销售点为:
文件所有者
Outlets
myTargetView -> Custom View
Referencing Outlets
delegate -> Window - Window
窗口 - 窗口
Outlets
delegate -> File's Owner
Referencing Outlets
window -> Window Controller
窗口 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 为零。它在启动时不是零,但当我尝试加载新 View 时为零。因此不会加载新 View 。我的 drop_view 就留在那里,什么也没发生。 myTargetView 代表我的主机 View (据我所知)。这是我的 nib 文件中窗口上的自定义 View 。您可以在我的 RAWindowController.h 文件中看到它设置的导出,并且该连接对我来说看起来不错。似乎引用正在丢失,可能是由于主机 View 被卸载?
我想也许这篇文章救了我: 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 对象为零(我假设是因为我的窗口对象设置为.nib 中的 NSWindowController)。
我有一种感觉,我无法掌握有关窗口、 Controller 、如何配置它们以及以编程方式访问它们的一些非常基本的知识。我很欣赏您的任何见解。
最佳答案
好的,这是我在提出您所链接的问题后九个月内所收集到的内容。每当您混合和匹配 Nib 、 View Controller 和窗口 Controller 时,事情都会变得很棘手。然而,如果你有积极的想法,数到三,然后敲木头,有时事情就会水到渠成。
这就是我在心理上分解各种 Controller 的方式:
NSWindowController (MyWindow.xib)
|
|-- NSViewController (MyFirstView.xib)
|
|-- NSView
|
|-- NSTextField
|-- NSButton
|-- NSImageView
|-- Etc.
|
|-- NSViewController (MySecondView.xib)
|
|-- NSView
|
|-- NSTableView
|-- NSButton
|-- Etc.
因此,根据您的情况,您需要在 RADropViewController.xib 中执行以下操作:
RADropViewController
是在“自定义类”字段中输入的类。RADropView
是在“自定义类”字段中输入的类。view
socket 。您现在已将 View Controller 连接到其 View 。通过在 RADropViewController.m 中执行以下操作,可以在代码中完成相同的操作:
- (void)awakeFromNib
{
self.view = [[RADropView alloc] initWithFrame:NSMakeRect(0, 0, 250, 250)];
}
现在,在 RATableViewController.xib(如果您决定采用代码路线,则在 RATableViewController.m)中重复这些步骤。
需要明确的是,您可以在 Interface Builder 中连接 View 或在代码中连接 View ,但不能同时连接两者。我曾经不小心覆盖了我的 View ,因为我会在 IB 中设置它们,然后在 -awakeFromNib
方法中再次设置它们。回想起来,我发现我基本上是在重做在 Interface Builder 中所做的所有事情,但在我真正掌握 Nib 解档过程之前,这似乎是一件合乎逻辑的事情。无论如何……回到乐趣。
现在您的 View Controller 已全部设置完毕,请跳至RAWindowController.xib。再次确保“文件所有者”对象指向您的窗口 Controller 类并将窗口连接到 window
socket 。
在RAWindowController.h中,通过将IBOutlet
宏关键字添加到 View Controller 属性来创建 View Controller socket :
@property (nonatomic, strong) IBOutlet RADropViewController *dropViewController;
@property (nonatomic, strong) IBOutlet RATableViewController *tableViewController;
现在回到RAWindowController.xib,将两个 View Controller 对象从对象浏览器拖到侧边栏。在 Identity Inspector 中,将每个类的类设置为其各自的 View Controller 类,并在 Attributes Inspector 中,将每个 Nib Name 设置为您之前使用的 nib。现在,将 View Controller 对象连接到您刚刚为其创建导出的属性。
最后,要切换 View ,请将如下内容添加到 RAWindowController.m 中:
- (void)changeViewController:(NSInteger)whichViewTag
{
NSView *contentView = self.window.contentView;
switch (whichViewTag)
{
case kDropView:
{
self.myCurrentViewController = self.dropViewController;
break;
}
case kTableView:
{
self.myCurrentViewController = self.tableViewController;
break;
}
}
if ( contentView.subviews.count > 0 )
{
[contentView replaceSubview:contentView.subviews[0]
with:self.myCurrentViewController.view];
} else {
[contentView addSubview:self.myCurrentViewController.view];
}
}
我现在很累,所以我可能错过了一些事情。然而,我不得不发帖,因为不久前我还在与这些事情作斗争。我希望我帮了一点忙。如果我有任何不清楚的地方,请告诉我,我会尽力更好地解释。不过,我向你保证:这一切最终都会有意义。有一天,它会“咔哒”一声,你就会 mock 这个古老的 Stack Overflow 问题。不管怎样,祝你好运,如果我能进一步阐明你不确定的事情,请告诉我。放轻松。
关于nsview - 如何配置 NSWindowController、NSViewController 和 NSView,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24967075/
我正在 Xcode5 中用 cocoa 为 MacOSX 开发一个应用程序,我想通过按一个按钮从当前窗口打开另一个窗口,这是我的代码: - (IBAction)openWindow:(id)sende
我有一个扩展 NSWindowController 的 BrowserWindowController 类。我的应用程序委托(delegate)有一个 BrowserWindowController,
我的应用程序观察其 NSWindowController 的 document 属性,并在设置时执行一些 UI 设置。一旦设置完毕,就很难因更改而重建 UI(出于内部原因)。 一旦 NSWindowC
我有一个基于菜单栏的应用程序,单击图标时会显示一个窗口。在 Mac OS X Lion 上一切正常,但由于某种原因,在 Snow Leopard 和早期版本的 Mac OS X 上会出现错误。任何时候
我对 Mac 编程非常陌生。三天前刚开始。 我正在制作一个示例应用程序,其中主窗口中有一个按钮 我正在使用此代码打开一个新的 wndowcontroller ThirdViewController *
我有一个包含在 nib 文件中的窗口,该窗口由 NSWindowController 的自定义子类加载,如下所示: - (id)init { self = [super initWithWin
我是 Cocoa 编程新手。 我有一个主 NSWindowController 并且想打开第二个子 NSWindowController。无论如何似乎找不到代码。 有人可以帮忙吗? 最佳答案 不确定这
如何处理单击 NSWindowController 的红色关闭按钮的事件? 询问的原因是我在新的 NSWindowController 窗口中播放视频,当用户单击红色关闭按钮时,音频继续播放,因此我想
我正在努力使这段代码工作: class MyWindowController: NSWindowController { let thing: Thing convenience init(t
我正在创建一个 cocoa 应用程序,并且正在使用 NSWindowController 加载首选项窗口。 当用户选择首选项按钮并打开首选项窗口时 我希望应用程序强制用户在返回到后台应用程序之前完成他
我正在通过自定义方法创建并显示一个 NSWindow,它恰好是我的首选项菜单: - (void)openPreferencesWindow{ if (![self.windowControll
有一个小问题,我正忙于创建 OSX 应用程序。在我的第一个 View (appdelegate)中,我得到了一个登录屏幕,但是在用户登录后我想要(翻转登录 Controller (main.xib)以
我创建了一个 NSWindow xib 文件,我想通过单击另一个窗口中的按钮来打开该文件。 现在,为了控制 NSWindow 的行为,我从 xib 中的库中拖动了一个对象,并将其更改为我在 XCode
我有一个使用 NSWindowController 子类的简单 Cocoa 应用程序。在我设置的 Nib 中: 将所有者的类文件保存到我的 NSWindowController 子类 文件所有者到 N
我有一个 NSWindowController,它显示一个表格并使用另一个 Controller 作为 NSTableView 的数据源和委托(delegate)。第二个 Controller 显示来
我一直在一个小型 Mac 应用程序中使用 Swift。 我一直在尝试添加一个非可选实例变量,但似乎我必须重写两个 init 方法。我最终得到的(编译的)代码如下所示: class CustomWind
我目前正在尝试构建一个菜单栏应用程序。因此,我需要一个 NSWindowController 作为登录字段。必须可以在按下菜单项时打开此 NSWindowController,并在用户单击取消时关闭该
我目前正在 NSWindowController 中搜索类似 viewDidAppear() 的函数。对于我的应用程序,我需要显示 NSWindowController 几次,然后使用 NSApp.h
我正在构建一个 Cocoa 应用程序并且有一个关于使用窗口 Controller 的问题。这个想法是,如果用户从菜单栏中选择新建,则会创建一个 MyWindowController 的实例,它是 NS
在this据说可以通过从 MainMenu.xib 中删除窗口并从 applicationDidFinishLaunching: 中“手动”实例化窗口 Controller 来获得自定义 NSWind
我是一名优秀的程序员,十分优秀!