打开一个新窗口并等待它关闭

时间:2011-09-26 19:46:53

标签: objective-c macos cocoa

我有一个用objetive-c Cocoa编写的Mac OS X应用程序。您可以在this previous question中看到大部分代码。基本上,您单击主窗口(应用程序委托)上的按钮,然后打开另一个窗口,用户可以在其中输入信息。

在以下代码中(当用户按下应用程序主窗口中的按钮时调用该代码)

- (IBAction)OnLaunch:(id)sender {

    MyClass *controllerWindow = [[MyClass alloc] initWithWindowNibName:@"pop"]; 
    [controllerWindow showWindow:self];

    NSLog(@"this is a log line");
}

NSLog行在我调用showWindow后立即获得打印机。有没有办法等到controllerWindow关闭才能继续使用NSlog?

原因是用户在我打开的新窗口上设置了一个值,我需要在同一个OnLaunch上收集该值,所以我需要等待。

我知道模态窗口在Mac中是不好的形式,但我无法控制此功能。

我试过

[NSApp runModalForWindow:[controllerWindow window]];

然后将弹出窗口设置为

[[NSApplication sharedApplication] runModalForWindow:popupwin];

它可以工作,但焦点永远不会再传递到主窗口了 谢谢!

2 个答案:

答案 0 :(得分:4)

如果您希望窗口适合您的应用程序,请使用工作表:http://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/Sheets/Tasks/UsingCustomSheets.html

但是,在显示工作表时无法暂停执行方法,这相当于阻止当前的运行循环。您必须将代码分解为开始和结束方法,如链接文档中所述。

以下是您需要遵循的步骤:

  • TestAppAppDelegate创建一个NSWindow出口以保留您的工作表并执行一项解除该工作表的操作
  • 创建一个以NSWindow为根对象的笔尖。我想你已经在“流行音乐”中有了这个。将Visible at Launch选项设置为NO (这非常重要)
  • 将此笔尖的文件所有者设置为TestAppAppDelegate并将窗口连接到新的插座,然后关闭新操作的按钮
  • 在启动工作表(OnLaunch)的方法中,使用以下代码:

(忽略这是为了使代码格式正确!)

if(!self.sheet)
  [NSBundle loadNibNamed:@"Sheet" owner:self];

[NSApp beginSheet:self.sheet 
   modalForWindow:self.window 
    modalDelegate:self 
   didEndSelector:@selector(didEndSheet:returnCode:contextInfo:) 
      contextInfo:nil];
  • 您的关闭按钮操作应为[NSApp endSheet:self.sheet];
  • 您的didEndSheet:方法应为[self.sheet orderOut:self];

答案 1 :(得分:-1)

您可以使用UIVIew方法animateWithDuration:delay:options:animations:completion:来完成此任务。

你说你想要在窗口关闭后执行下一行,而不是在打开窗口后执行。无论如何,您可以这样结束OnLaunch方法:

- (IBAction)OnLaunch:(id)sender {

    MyClass *controllerWindow = [[MyClass alloc] initWithWindowNibName:@"pop"]; 

    [controllerWindow animateWithDuration:someDelay:options: someUIAnimationOption
    animations:^{
        [controllerWindow showWindow:self]; // now you can animate it in the showWindow method
    }
    completion:^{
         [self windowDidFinishShowing];  // or [self windowDidFinishDisappearing]
    }
}

- (void) windowDidFinishShowing {
    NSLog(@"this is a log line");
}