NSApp表格在可可中提出问题

时间:2010-05-26 00:07:55

标签: cocoa

这是我想要做的。我需要提示用户输入密码,直到他输入密码并点击,然后说明工作表上的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");

   }

1 个答案:

答案 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
    }
}