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

Mr *_*eph 3 macos cocoa objective-c

我有一个用 Objective-C Cocoa 编写的 Mac OS X 应用程序。您可以在上一个问题中看到大部分代码。本质上,您单击主窗口(应用程序委托)上的按钮,它会打开另一个窗口,用户可以在其中输入信息。

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

- (IBAction)OnLaunch:(id)sender {

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

    NSLog(@"this is a log line");
}
Run Code Online (Sandbox Code Playgroud)

NSLog我打电话后,线路立即得到打印机showWindow。有什么办法可以等到controllerWindow关闭后再继续NSlog吗?

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

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

我尝试过

[NSApp runModalForWindow:[controllerWindow window]];
Run Code Online (Sandbox Code Playgroud)

然后将弹出窗口设置为

[[NSApplication sharedApplication] runModalForWindow:popupwin];
Run Code Online (Sandbox Code Playgroud)

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

jrt*_*ton 5

如果您希望窗口为应用程序的模式,请使用工作表: https: //developer.apple.com/library/archive/documentation/Cocoa/Conceptual/Sheets/Tasks/UsingCustomSheets.html

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

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

  • 创建TestAppAppDelegate一个NSWindow插座来保存您的工作表和一个操作来关闭工作表
  • NSWindow创建一个以 an作为根对象的笔尖。我认为你已经在“流行”中拥有了这个。将选项设置Visible at LaunchNO (这非常重要)
  • 将此笔尖的文件所有者设置为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];
Run Code Online (Sandbox Code Playgroud)
  • 您的关闭按钮操作应该是[NSApp endSheet:self.sheet];
  • 你的didEndSheet:方法应该是[self.sheet orderOut:self];