当NSSavePanel出现时,关闭的NSWindow出现(osx cocoa)

时间:2015-07-15 15:20:25

标签: objective-c macos cocoa nswindow nswindowcontroller

我写了一个OSX故事板应用程序,它有一个闪屏。它是NSWindow,带有NSWindowController,没有子类,有一个SplashViewController,它是NSViewController的子类。

以下是SplashViewController的代码:

NSArray *a = [[NSApplication sharedApplication] windows];
NSLog(@"%ld", a.count);

NSSavePanel *savePanel = [NSSavePanel savePanel];
[savePanel setAllowedFileTypes:@[@"pdf"]];
[savePanel setDirectoryURL:[NSURL URLWithString:NSHomeDirectory()]];
[savePanel beginSheetModalForWindow:self.view.window completionHandler:nil];

这会按预期关闭窗口/窗口控制器。

segue有 show 类型,并呈现另一个NSWindowController,它有MainViewController,NSViewController的子类。当MainViewController打开保存对话框时:

$locale

出现旧的启动窗口(打印“1”)。什么?我的意思是它出现的原因? NSSavePanel与它有什么关系?

1 个答案:

答案 0 :(得分:0)

感谢this answer(尽管部分无关),我设法让它发挥作用。

使用storyboard时看起来有几个错误(我正在使用XCode 6.3.1)。为了解决这个问题,你需要:

  • 选择您的初始窗口控制器并取消选中"是初始控制器" (即没有为故事板设置初始控制器)。

  • 您的主窗口控制器进行子类化,即使子类为空。

  • 将主窗口控制器的故事板ID设置为 Main (如果省略上一步,故事板ID 已删除,一旦离开故事板,第一个bug )。

  • 在AppDelegate.m中添加以下代码:

    @property (strong, nonatomic) NSWindowController *mainWindowController;
    
    - (void)applicationDidFinishLaunching:(NSNotification *)aNotification
    {
        [NSApp activateIgnoringOtherApps:YES];
    
        NSStoryboard *storyboard = [NSStoryboard storyboardWithName:@"Main" bundle:nil];
        NSWindowController *main = [storyboard instantiateControllerWithIdentifier:@"Main"];
        [main showWindow:self];
        [main.window makeKeyAndOrderFront:self];
    
        // Important! Should be strong to retain instance. Second bug. 
        // If you don't do that, your window will open and close right away.
        _mainWindowController = main; 
    }