我的目标:当应用程序通过一个冗长的循环运行时,显示一个具有确定 NSProgressIndicator 的自定义工作表。我希望工作表是应用程序模式,而不是文档模式。用户不能关闭模式表。他们必须等待应用程序完成循环处理。
问题:我无法将自定义工作表附加到窗口。它显示为缺少窗口标题栏的单独窗口(作为工作表应该)。此外,循环结束时不会释放(不关闭)工作表。
我有 2 个用于工作表和主应用程序窗口的单独 nib 文件,以及每个窗口的 2 个控制器类。
以下是相关信息:自定义工作表的控制器实现:
@implementation ProgressSheetController //subclass of NSPanel
-(void)showProgressSheet:(NSWindow *)window
{
//progressPanel is an IBOutlet to the NSPanel
if(!progressPanel)
[NSBundle loadNibNamed:@"ProgressPanel" owner:self];
[NSApp beginSheet: progressPanel
modalForWindow: window
modalDelegate: nil
didEndSelector: nil
contextInfo: nil];
//modalSession is an instance variable
modalSession = [NSApp beginModalSessionForWindow:progressPanel];
[NSApp runModalSession:modalSession];
}
-(void)removeProgressSheet
{
[NSApp endModalSession:modalSession];
[NSApp endSheet:progressPanel];
[progressPanel orderOut:nil];
}
//some other methods
@end
主应用程序窗口的实现。testFiles 方法是一个连接到按钮的 IBAction。
@implementation MainWindowViewController //subclass of NSObject
-(IBAction)testFiles:(id)sender;
{
//filesToTest is a mutable array instance variable
int count = [filesToTest count];
float progressIncrement = 100.0 / count;
ProgressSheetController *modalProgressSheet = [[ProgressSheetController alloc] init];
[modalProgressSheet showProgressSheet:[NSApp mainWindow]];
int i,
for(i=0; i<count; i++)
{
//do some stuff with the object at index i in the filesToTest array
//this method I didn't show in ProgressSheetController.m but I think it's self explanatory
[modalProgressSheet incrementProgressBarBy:progressIncrement];
}
//tear down the custom progress sheet
[modalProgressSheet removeProgressSheet];
[modalProgressSheet release];
}
@end
一个想法:我的子类化正确吗?我应该改用 NSWindowController 吗?预先感谢您的帮助!