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

Posted

技术标签:

【中文标题】打开一个新窗口并等待它关闭【英文标题】:Opening a new window and waiting for it to close 【发布时间】:2011-09-26 19:46:52 【问题描述】:

我有一个用 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");

在我调用showWindow 后,NSLog 行立即获取打印机。有什么方法可以等到controllerWindow 关闭后再继续 NSlog?

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

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

我试过了

[NSApp runModalForWindow:[controllerWindow window]];

然后将弹出窗口设置为

[[NSApplication sharedApplication] runModalForWindow:popupwin];

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

【问题讨论】:

我会回答我自己的问题:答案是Here 【参考方案1】:

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

但是,在显示工作表时无法暂停方法的执行,这无异于阻塞当前的运行循环。您必须按照链接文档中的说明将代码分解为 begin 和 end 方法。

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

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];

【讨论】:

好的,你介意给我举个例子吗?我已经尝试阅读工作表的文档,但我更加困惑。请记住,我需要 2 个 texfields 和 2 个按钮。我尝试使用警报,但它只允许我添加一个文本字段。 我提供的链接显示了如何使用您自己的笔尖制作自定义表格。在笔尖中,您可以将文件的所有者设置为您的调用类,并在那里为笔尖中的***对象提供一个出口,以及任何按钮的操作。你不会有一个单独的控制器类。如果您用到目前为止的内容更新您的问题,我会尽力提供帮助,但我不是来为您编写代码的! 我没有让你写代码,我只是问你一个如何用我所拥有的实现这个的例子,顺便说一下我发布的。 Apple 开发网站上的代码对我没有任何意义,我似乎无法将其转换为我需要的代码。因为我是来***寻求帮助的。虽然我很欣赏大多数情况下“试试这个”和“试试那个”的答案,但我不明白为什么在 Mac OS 上获得一个窗口模式如此复杂。我想我对这里答案的期望是错误的。无论如何,谢谢。 它指向你给我的同一个苹果开发链接和一个过时的网站,它没有适用于当前 xcode 的代码。我试图理解你想让我做什么,但我做不到。我的应用程序中有 2 个 xib(请参阅此 previous question 中的完整代码)如何将第 2 个 xib 用作工作表?到目前为止,我还没有在您的任何链接上找到答案 即使我尝试:[NSApp beginSheet:popWindow.RelativePopup modalForWindow:[self window] modalDelegate:self didEndSelector:nil contextInfo:nil];我哪儿也不去。【参考方案2】:

您可以使用 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");

【讨论】:

新窗口动画完成时不会调用这个完成块吗?他想要的是当窗口关闭时,而不是完成动画。 是的,重点是将打开窗口的操作和事件的完成分开,就像动​​画完成事件一样。无论他在哪里发起关闭窗口都应该调用 windowDidFinishShowing。如果他希望它在窗口真正消失后发生,那么我建议将此完成事件与动画方法一起使用。 顺便说一句,我不得不解释你在问什么。我不认为有一个称为“关闭”的窗口的状态,但我可能是错的。所以我假设你指的是一个以某种方式改变状态的视图,比如被隐藏,或者它的大小已经减小到零。 (我使用ios编程,所以我不知道多个窗口,但是使用IOS,您可以“打开”和“关闭”任意数量的视图。) 我无法弄清楚animateWithDuration:someDelay:options: someUIAnimationOptionanimationssomedelay,那是什么?毫秒,秒?如果使用需要 10 分钟才能关闭窗口呢? @jim 不,这很简单:您打开新窗口并等到用户关闭它。简单明了。就像打开文件对话框一样,您要等到用户关闭它才能获取文件名的值

以上是关于打开一个新窗口并等待它关闭的主要内容,如果未能解决你的问题,请参考以下文章

启动 Firefox 并等待它关闭

启动 Firefox 并等待它关闭

启动 Chrome 并等待它关闭 [重复]

启动 Safari 并等待它关闭 [重复]

Selenium - 当前窗口关闭并在浏览器窗口中打开新窗口

如何用JS打开新窗口,并关闭原来窗口