我曾经多次在项目中使用过NSWindowController,感觉我对这个重要课程背后的概念有了非常粗略的把握.我想对这篇文章做的是澄清/纠正我自己的理解,并希望帮助其他学习者迈出理解的第一步.这是我发现最有用的一目了然的概念,概述和最佳实践,并且通常缺少文档.这是我对NSWindowController的看法(问题以粗体点缀):
window
属性应始终链接到InterfaceBuilder中的NSWindow.[super initWithWindowNibName:]
这样当你引用[mycontroller window]
它时会加载nib.对于MainMenu.xib窗口的NSWC,情况也是如此,即使这是在启动时打开的吗?使用[mycontroller showWindow:nil]
以显示前面的相关窗口.如果您希望窗口显示为工作表,请使用以下内容:
NSWindowController* mycontroller = [[MyController alloc] init];
[NSApp beginSheet: [mycontroller window]
modalForWindow: [self window]
modalDelegate: self
didEndSelector: @selector(didEndMySheet:returnCode:contextInfo:)
contextInfo: nil];
Run Code Online (Sandbox Code Playgroud)的didEndSelector:
应该是父窗口的NSWC的方法,并且可以访问和释放"myController的"带[sheet windowController]
.- 要关闭窗口,请调用performClose:
NSWC窗口的方法.
一些问题:
请纠正我,如果这是不好的做法,或者是完全错误的.我希望澄清我对NSWindowController的理解,所以任何添加(以最佳实践,经验,陷阱的形式)都将受到高度赞赏.
谢谢,劳里
Presentation选项(在Attribute Inspector中)究竟在StoryBoard for Cocoa中做了什么.
它提供了两个选项供您选择
PS用Google搜索标题时,结果与powerpoint演示文稿有关
我正在尝试在Swift中启动一个基于Cocoa项目的新文档,并希望创建一个子类NSWindowController
(如Apple的基于文档的应用程序指南中所推荐的).在ObjC中,您将创建一个NSWindowController
子类的实例,该子类发送initWithWindowNibName:
消息,相应地实现,调用超类方法.
在斯威夫特init(windowNibName)
仅作为一种方便的初始化,类的指定初始化NSWindowController
就是init(window)
这显然想让我在一个窗口中通过.
我不能super.init(windowNibName)
从我的子类调用,因为它不是指定的初始化器,所以我显然必须实现convenience init(windowNibName)
,而这又需要调用self.init(window)
.但是,如果我只有我的nib文件,如何访问nib文件的窗口以发送到该初始化程序?
我来自iOS背景并开始学习Cocoa.在iOS上,除非我们有多个目标iPad
,iPhone
我们通常有一个窗口并使用管理屏幕UIViewControllers
.每个新屏幕大部分时间都会映射到一个UIViewController
.
然而,对于可可,这似乎是一个新的屏幕/窗口管理的地方NSWindow
,它的子组件由管理NSViewController
.因此,如果我有多个窗口应用程序,我应该NSWindowController
为每个窗口分开.
这种方法是正确的还是我有误解?
cocoa cocoa-touch objective-c nswindowcontroller cocoa-design-patterns
我有一个包含两个窗口的NIB,一个是启动时可见的应用程序主窗口,另一个是自定义工作表(因此在启动时不可见).当需要工作表时,我的控制器会调用:
[NSApp beginSheet: sheetWindow modalForWindow: mainWindow modalDelegate: self didEndSelector: @selector(didEndSheet:returnCode:contextInfo:) contextInfo: nil];
它显示工作表窗口并启动模态会话,但窗口有一个标准的Aqua标题栏,没有"连接"到主窗口,可以像常规窗口一样移动.不用说,这是不可取的:-).为什么表单窗口"弹出"它所运行的窗口,就像工作表通常以这种方式开始时一样?
我想知道我是否在控制器内部开始工作表的事实-awakeFromNib
可能会产生影响,所以我将工作表移动到按钮的动作,我可以稍后触发.这并未改变行为.我没有想过要尝试的任何其他事情.我的目标是10.5 SDK,使用Xcode 3.1.
编辑:所以看起来我已经创建了一个模态对话框; 工作表和应用程序模式对话框都是使用该-beginSheet:modalForWindow:modalDelegate:didEndSelector:contextInfo:
方法启动的.但是,如何指示我的窗口应该是工作表而不是模态对话框?
如何处理我点击NSWindowController的红色关闭按钮的事件?
询问的原因是我在新的NSWindowController窗口中播放视频,当用户点击红色关闭按钮时,音频继续播放,因此我想使用该事件关闭视频.
我正在尝试使用以下代码打开NSWindow:
NSWindowController *window = [[NSWindowController alloc] initWithWindowNibName:@"MainWindow"];
[window showWindow:nil];
Run Code Online (Sandbox Code Playgroud)
窗口打开正常但前一个窗口仍然是mainWindow并且是焦点.我尝试了以下代码来强制主窗口,它不起作用.该窗口仍有一个禁用的标题栏,不接受关键事件等.
[self.window makeKeyAndOrderFront:self];
[self.window makeMainWindow];
Run Code Online (Sandbox Code Playgroud)
我似乎能够让前一个窗口失去焦点的唯一方法是在调用showWindow后关闭窗口:[[NSApp mainWindow] close];
有任何想法吗?
当NSWindow应该或将要关闭时,我该如何注意?我想要像windowWillClose这样的东西.不幸的是,NSWindowController没有像UIViewController那样方便的方法.那么这样做的最佳做法是什么?
谢谢
-f
我正在为我的个人用途申请一个定期提醒我和/或需要输入文字的申请.因此,此弹出窗口具有NSTextField.
如果在我打字的过程中窗口弹出窗口,我的输入会转移到弹出窗口,这非常烦人!有没有办法阻止这个,目前我正在使用:
[NSApp activateIgnoringOtherApps:YES];
[hudWindow makeKeyAndOrderFront:nil];
Run Code Online (Sandbox Code Playgroud)
我也尝试过:
[NSApp activateIgnoringOtherApps:YES];
[hudWindow orderFrontRegardless];
Run Code Online (Sandbox Code Playgroud)
还有其他办法吗?
喜欢在标题中,[myWindowController showWindow:nil]
不起作用.以下是您可能需要了解的一些事实:
KRAuthenticationWindowController
AuthenticationWindow.xib
KRAuthenticationWindowController
window
插座连接到窗口delegate
已连接到File的所有者Visible at launch
是未选中的Release when closed
也是未选中的我的代码如下:
// KRApplicationDelegate.m
- (void)applicationDidFinishLaunching:(NSNotification *)notification {
NSLog(@"%s",__PRETTY_FUNCTION__);
KRAuthenticationWindowController *authWindowController = [[KRAuthenticationWindowController alloc] init];
[authWindowController showWindow:nil];
[[authWindowController window] makeKeyAndOrderFront:nil];
}
// KRAuthenticationWindowController.m
- (id)init {
self = [super initWithWindowNibName:@"AuthenticationWindow"];
if(!self) return nil;
NSLog(@"%s",__PRETTY_FUNCTION__);
return self;
}
- (void)loadWindow {
[super loadWindow];
[self.window setBackgroundColor:[NSColor colorWithDeviceWhite:0.73 alpha:1]];
NSLog(@"%s",__PRETTY_FUNCTION__);
}
- (void)windowDidLoad {
[super windowDidLoad];
NSLog(@"%s",__PRETTY_FUNCTION__);
}
- …
Run Code Online (Sandbox Code Playgroud) cocoa ×10
objective-c ×5
macos ×4
nswindow ×4
cocoa-sheet ×2
appkit ×1
cocoa-touch ×1
initializer ×1
nstextfield ×1
storyboard ×1
swift ×1