我有一个用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];
它可以工作,但焦点永远不会再传递到主窗口了 谢谢!
答案 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");
}