我有一个基于文档的核心数据应用程序.主文档窗口有许多视图,每个视图都由自己的自定义控制,NSViewController必要时可以切换.我希望每个视图控制器都能够从文档窗口下拉自定义模式表.但是因为视图是分开的而不是在MyDocument nib我不能将视图链接到IB中的文档窗口.这意味着我打电话的时候
[NSApp beginSheet: sheetWindow modalForWindow: mainWindow modalDelegate: self didEndSelector: @selector(didEndSheet:returnCode:contextInfo:) contextInfo: nil];
Run Code Online (Sandbox Code Playgroud)
我供应零,mainWindow因此这张纸看起来很独立.
有什么建议?
非常感谢
我曾经多次在项目中使用过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的理解,所以任何添加(以最佳实践,经验,陷阱的形式)都将受到高度赞赏.
谢谢,劳里
我正在尝试将一个登录窗口显示为来自我的MainWindow的工作表,但每当我尝试实现AppKit方法时,总会出现错误,因为各种无法区分的原因.
没有任何在线指南有效,当我将他们的代码/改编的课程应用到我自己的项目时,他们永远不会工作.
大多数指南都过时了,包括Apple文档.而且它们似乎都与自动参考计数兼容.或Xcode 4接口.
有人能够在完整的指南中为我详细说明,以便在MainWindow上按下按钮后显示表单的最简单方法.
如果需要,请随时询问更多信息.
我有一个包含两个窗口的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:方法启动的.但是,如何指示我的窗口应该是工作表而不是模态对话框?
如何在单独的NIB中放置一个窗口,给它自己的NSWindowController,让它作为一张纸滑出?
(这是与床单有关的典型事吗?)
我试图从我的主窗口显示一个自定义工作表(从父窗口的标题栏向下滑动的窗口).我想,我想要做的就是标准,但是我找不到明确的例子或解释如何做到我想要的.
我想做什么:
- (void)showCustomSheet: (NSWindow *)window
// User has asked to see the custom display. Display it.
{
if (!settingsSheet)
//Check the settingsSheet instance variable to make sure the custom sheet does not already exist.
[NSBundle loadNibNamed:@"SettingsSheet" owner: self];
//BUT HOW DOES THIS MAKE settingsSheet NOT nil?
[NSApp beginSheet: settingsSheet
modalForWindow: window
modalDelegate: self
didEndSelector: @selector(didEndSheet:returnCode:contextInfo:)
contextInfo: nil];
// Sheet is up here.
// Return processing to the event loop
} …Run Code Online (Sandbox Code Playgroud) 我正在写一个Cocoa应用程序,基本上我有一个窗口,我需要在打开另一个窗口之前检查工作表是否打开.谷歌似乎并不知道那一个.如何检查纸张是否打开?
我正在尝试将NSPanel显示为工作表.我天真地做着这样的事情:
SheetController *sheetController = [[[SheetController alloc]
initWithWindowNibName:@"Sheet"] autorelease];
[[NSApplication sharedApplication] beginSheet:sheetController.window
modalForWindow:self.window
modalDelegate:self
didEndSelector:@selector(sheetDidEnd:returnCode:contextInfo:)
contextInfo:nil];
Run Code Online (Sandbox Code Playgroud)
出于某些原因,我无法解决这个问题.当调用此部分代码时,工作表会暂时闪烁(因为autorelease消息).纸张永远不会挂在窗户上.
如果有人能指出我可以找到更多信息的地方,那将非常感激.
我有saveWindowController(NSWindowController子类对象).我使用initWithWindowNibName:方法来初始化控制器.
我在xib中设置了File的所有者SaveWindowController.我在xib文件中连接delegate(从窗口)到File的所有者和window(从控制器)到NSWindow.
[NSApp beginSheet:[self.saveWindowController window]
modalForWindow:[self window]
modalDelegate:nil didEndSelector:nil contextInfo:nil];
Run Code Online (Sandbox Code Playgroud)
执行此方法后,我看到没有标题栏的模态窗口,它看起来不像普通表.它只出现在第一个窗口的左下角.
你能帮帮我吗,我做错了什么?
Mike Ash创建了一个使用块来处理来自工作表的回调的示例,这看起来非常好.这反过来更新为用户Enchilada在beginSheet的另一个SO问题中使用垃圾收集:块替代?, 见下文.
@implementation NSApplication (SheetAdditions)
- (void)beginSheet:(NSWindow *)sheet modalForWindow:(NSWindow *)docWindow didEndBlock:(void (^)(NSInteger returnCode))block
{
[self beginSheet:sheet
modalForWindow:docWindow
modalDelegate:self
didEndSelector:@selector(my_blockSheetDidEnd:returnCode:contextInfo:)
contextInfo:Block_copy(block)];
}
- (void)my_blockSheetDidEnd:(NSWindow *)sheet returnCode:(NSInteger)returnCode contextInfo:(void *)contextInfo
{
void (^block)(NSInteger returnCode) = contextInfo;
block(returnCode);
Block_release(block);
}
@end
Run Code Online (Sandbox Code Playgroud)
启用GC时,这不适用于自动引用计数(ARC).我自己,作为ARC和街区的初学者,都无法让它发挥作用.我应该如何修改代码以使其与ARC一起使用?
我知道Block_release()的东西需要去,但我无法通过关于使用ARC禁止将'void*'转换为'void(^)(NSInteger)'的编译错误.
cocoa objective-c objective-c-blocks automatic-ref-counting cocoa-sheet
我把它分解成了一个非常小的项目.在应用程序委托中使用以下代码:
- (void)applicationDidFinishLaunching:(NSNotification *)aNotification
{
TestingWindowController * testingWindowController = [[TestingWindowController alloc] initWithWindowNibName: @"TestingWindowController"];
// Begin our sheet
[NSApp beginSheet: testingWindowController.window
modalForWindow: self.window
modalDelegate: self
didEndSelector: @selector(windowDidEnd:returnCode:contextInfo:)
contextInfo: NULL];
}
- (void)windowDidEnd:(id)alert returnCode:(NSInteger)returnCode contextInfo:(id) contextInfo
{
// If the user did not accept, then we really don't care what else they did!
if (returnCode != NSOKButton) return;
// We have had an error. Display it.
[[NSApplication sharedApplication] presentError: nil
modalForWindow: self.window
delegate: nil
didPresentSelector: nil
contextInfo: NULL];
}
Run Code Online (Sandbox Code Playgroud)
以下操作绑定到Windows笔尖上的按钮.(请注意,nib的窗口也设置为在启动时不可见).
- (IBAction) …Run Code Online (Sandbox Code Playgroud) cocoa ×10
cocoa-sheet ×10
nswindow ×5
macos ×4
objective-c ×4
appkit ×1
osx-lion ×1
xcode4.2 ×1