打开一个新窗口并等待它关闭
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: someUIAnimationOptionanimations
和somedelay
,那是什么?毫秒,秒?如果使用需要 10 分钟才能关闭窗口呢?
@jim 不,这很简单:您打开新窗口并等到用户关闭它。简单明了。就像打开文件对话框一样,您要等到用户关闭它才能获取文件名的值以上是关于打开一个新窗口并等待它关闭的主要内容,如果未能解决你的问题,请参考以下文章