这是我想要做的。我需要提示用户输入密码,直到他输入密码并点击,然后说明工作表上的Enter按钮,我想阻止在后台解析代码。 这是运行工作表的代码,当用户输入密码并按Enter键时,运行endSpeedSheet。我从Main()函数调用所有这些。
我注意到的是,当主要功能运行时,工作表显示,提示用户输入密码。但在后台,我已经看到“Code gets here”已经运行。这意味着代码已经在后台运行。我需要的是在密码提示下等待的代码,然后在Sheet被解除后使用此密码。我想念的是什么? (并提前感谢:))
- (IBAction) showSpeedSheet:(id)sender
{
[NSApp beginSheet:speedSheet
modalForWindow:(NSWindow *)window
modalDelegate:nil
didEndSelector:nil
contextInfo:nil];
}
-(IBAction)endSpeedSheet:(id)sender
{
joinPassword = [joinPasswordLabel stringValue];
[NSApp endSheet:speedSheet];
[speedSheet orderOut:sender];
}
-(IBAction)main:(id)sender
{
[self showSpeedSheet:(id)sender];
// More Code here
NSLog(@" Code gets here");
}
答案 0 :(得分:1)
答案很简单:在调用-showSpeedSheet:
后,请不要在工作表完成后放置需要运行的代码。表格是异步的,因此您必须对代码进行分解,以便仅在工作表完成后调用它。
这就是didEndSelector
方法中‑beginSheet:modalForWindow:modalDelegate:didEndSelector:contextInfo:
参数的用途。传入选择器以在关闭工作表时调用。在模态委托对象中,您可以实现此选择器,并在工作表完成后执行任何需要处理的处理。
- (IBAction) showSpeedSheet:(id)sender
{
[NSApp beginSheet:speedSheet
modalForWindow:self.window
modalDelegate:self
didEndSelector:@selector(speedSheetDidEnd:returnCode:contextInfo:)
contextInfo:nil];
}
- (IBAction)endSpeedSheet:(id)sender
{
self.joinPassword = [joinPasswordLabel stringValue];
[NSApp endSheet:speedSheet];
[speedSheet orderOut:sender];
}
- (void)speedSheetDidEnd:(NSWindow *)sheet returnCode:(NSInteger)returnCode contextInfo:(void *)contextInfo
{
if(sheet == speedSheet)
{
//the sheet has ended, so do something
}
}