标签: cocoa-sheet

OS X - NSViewController如何找到它的窗口?

我有一个基于文档的核心数据应用程序.主文档窗口有许多视图,每个视图都由自己的自定义控制,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因此这张纸看起来很独立.

有什么建议?

非常感谢

macos cocoa cocoa-sheet

45
推荐指数
2
解决办法
3万
查看次数

NSWindowController澄清理解

我曾经多次在项目中使用过NSWindowController,感觉我对这个重要课程背后的概念有了非常粗略的把握.我想对这篇文章做的是澄清/纠正我自己的理解,并希望帮助其他学习者迈出理解的第一步.这是我发现最有用的一目了然的概念,概述和最佳实践,并且通常缺少文档.这是我对NSWindowController的看法(问题以粗体点缀):

  • NSWindowController(NSWC)子类(概念上)存在于每个窗口笔尖下方,充当用户界面元素与它们控制/表示的模型对象之间的粘合剂.基本上,应用程序中的每个窗口都应该有自己的NSWC子类.
  • nib的文件所有者应始终是NSWC的子类.即使是MainMenu.xib应用程序也是如此?
  • NSWC window属性应始终链接到InterfaceBuilder中的NSWindow.
  • 你应该使用覆盖'init'方法,[super initWithWindowNibName:]这样当你引用[mycontroller window]它时会加载nib.对于MainMenu.xib窗口的NSWC,情况也是如此,即使这是在启动时打开的吗?
  • NSWC不应该做太多繁重的工作 - 它应该只是将消息传递给对象的实例,并在UI中呈现这些对象.
  • 它可以使用绑定来修改UI,或者作为表等的委托来修改UI,或者通过在观察到更改时主动更改UI元素,或者上述任何一个的组合(您使用哪一个似乎是一个问题)品味,各方利弊).
  • NSWC可以在必要时创建其他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窗口的方法.

一些问题:

  • MainMenu窗口的NSWC是否也应该是应用程序代表,还是应该是不同的类?
  • 同样,主要的NSWC应该处理文件(拖放和打开),还是应该传递给应用代表,还是仅仅是品味问题?

请纠正我,如果这是不好的做法,或者是完全错误的.我希望澄清我对NSWindowController的理解,所以任何添加(以最佳实践,经验,陷阱的形式)都将受到高度赞赏.

谢谢,劳里

cocoa nswindowcontroller cocoa-sheet

40
推荐指数
2
解决办法
9044
查看次数

使用ARC在Xcode 4(OSX 10.7.2)中将Cocoa窗口显示为工作表

我正在尝试将一个登录窗口显示为来自我的MainWindow的工作表,但每当我尝试实现AppKit方法时,总会出现错误,因为各种无法区分的原因.

没有任何在线指南有效,当我将他们的代码/改编的课程应用到我自己的项目时,他们永远不会工作.

大多数指南都过时了,包括Apple文档.而且它们似乎都与自动参考计数兼容.或Xcode 4接口.

有人能够在完整的指南中为我详细说明,以便在MainWindow上按下按钮后显示表单的最简单方法.

如果需要,请随时询问更多信息.

cocoa xcode4.2 automatic-ref-counting osx-lion cocoa-sheet

35
推荐指数
2
解决办法
1万
查看次数

为什么我的表单不附加到它运行的窗口?

我有一个包含两个窗口的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:方法启动的.但是,如何指示我的窗口应该是工作表而不是模态对话框?

cocoa objective-c nswindow nswindowcontroller cocoa-sheet

25
推荐指数
2
解决办法
5695
查看次数

如何从单独的NIB显示工作表

如何在单独的NIB中放置一个窗口,给它自己的NSWindowController,让它作为一张纸滑出?

(这是与床单有关的典型事吗?)

我试图从我的主窗口显示一个自定义工作表(从父窗口的标题栏向下滑动的窗口).我想,我想要做的就是标准,但是我找不到明确的例子或解释如何做到我想要的.

我想做什么:

  1. 我的app delegate拥有主窗口,该窗口有一个用于打开"设置"表的按钮.
  2. "设置"表:
    • 是在一个单独的NIB.
    • 将文件所有者设置为类SettingsWindowController,它是NSWindowsController的子类
  3. 当用户点击"设置"时,我试图使用Apple的[示例代码] [1]
- (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)

macos cocoa objective-c interface-builder cocoa-sheet

8
推荐指数
1
解决办法
3338
查看次数

检查纸张是否打开

我正在写一个Cocoa应用程序,基本上我有一个窗口,我需要在打开另一个窗口之前检查工作表是否打开.谷歌似乎并不知道那一个.如何检查纸张是否打开?

macos cocoa appkit nswindow cocoa-sheet

8
推荐指数
1
解决办法
1216
查看次数

如何将NSPanel显示为工作表

我正在尝试将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消息).纸张永远不会挂在窗户上.

如果有人能指出我可以找到更多信息的地方,那将非常感激.

cocoa objective-c nswindow cocoa-sheet

7
推荐指数
1
解决办法
6571
查看次数

beginSheet方法对我不起作用

我有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)

执行此方法后,我看到没有标题栏的模态窗口,它看起来不像普通表.它只出现在第一个窗口的左下角.

你能帮帮我吗,我做错了什么?

macos cocoa nswindow cocoa-sheet

6
推荐指数
1
解决办法
1861
查看次数

beginSheet:使用ARC阻止替代方案?

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

6
推荐指数
1
解决办法
2661
查看次数

Cocoa:在NSApp beginSheet结果隐藏主窗口后显示错误

我把它分解成了一个非常小的项目.在应用程序委托中使用以下代码:

- (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 nswindow cocoa-sheet

5
推荐指数
2
解决办法
2190
查看次数