0

在使用 XCODE 和 Objective-C 的 MAC 上,我需要显示一个小的“”窗口,其中包含一个微调器和一个取消按钮。这将阻止用户在我的应用程序中执行任何其他操作,直到我完成长操作,但是如果他们单击取消它应该停止操作。

我尝试NSWindowController使用取消按钮创建一个简单的基于窗口并制作窗口模式,就像 这样

-(void) start_long_operation {
............

[self showBusy];
return; // return to continue the long operation
}

// 抛出一个“忙碌”的对话框,这样用户在完成之前不能做任何事情

-(void) showBusy {  
    BusyNSWindow *loadingView = [[LoadingView alloc] initWithWindowNibName:@"LoadingView"];<br>
    [[NSApplication sharedApplication] runModalForWindow:loadingView.window];  
}

// 如果取消点击,信号停止长操作,关闭“忙碌”对话框

-(IBAction) cancel
{
// cancel was clicked inside the "busy" dialog box so signal process to stop long operation
}



但发生的事情是它留在里面[[NSApplication sharedApplication] runModalForWindow:loadingView.window]并且不返回。我希望它返回,以便它可以在“忙碌”对话框启动时继续长时间处理,所以这不起作用。

任何人都知道如何创建一个带有取消按钮和微调器的小“忙碌”窗口,以防止用户在操作完成之前在该窗口外单击,但允许程序的其余部分正常继续,以便它可以处理长时间操作?

-rough_neck

4

1 回答 1

0

无论如何都不应该在主线程上进行长操作。用于长时间运行的操作NSOperationNSOperationQueue所以它在后台运行,然后模态窗口就可以正常工作了。

另一种选择,但不太方便,是使用“模态会话”。请参阅-beginModalSessionForWindow:-runModalSession:-endModalSession:的方法NSApplication。为此,您必须将长时间运行的操作分解为可以按顺序调用的快速运行步骤。

于 2013-02-10T20:25:24.470 回答