Objective c 第一次贴一张纸

Objective c 第一次贴一张纸,objective-c,macos,cocoa,Objective C,Macos,Cocoa,我正在编写一个需要从智能卡读取数据的应用程序。由于智能卡的工作方式,此操作可能需要几秒钟的时间,在这段时间内,它会用迄今为止读取的内容更新显示器,但在读取所有内容之前,它不会完全响应;因此,为了避免混淆,我想显示一个带有微调器的工作表和文本“从卡读取数据…”,以便用户知道发生了什么 在我的Xib中,我创建了一个新窗口,其中包含微调器和NSTextField。当我尝试显示图纸时,我会执行以下操作: [[NSOperationQueue mainQueue] addOperationWithBloc

我正在编写一个需要从智能卡读取数据的应用程序。由于智能卡的工作方式,此操作可能需要几秒钟的时间,在这段时间内,它会用迄今为止读取的内容更新显示器,但在读取所有内容之前,它不会完全响应;因此,为了避免混淆,我想显示一个带有微调器的工作表和文本“从卡读取数据…”,以便用户知道发生了什么

在我的Xib中,我创建了一个新窗口,其中包含微调器和NSTextField。当我尝试显示图纸时,我会执行以下操作:

[[NSOperationQueue mainQueue] addOperationWithBlock:^{
    [_spinner startAnimation:self];
    [NSApp beginSheet:_CardReadSheet modalForWindow:_window modalDelegate:self 
           didEndSelector:@selector(endSheet:returnCode:contextInfo:) contextInfo:nil];
}];
然后,当我的状态机指示我们已经完成阅读时,我会:

[[NSOperationQueue mainQueue] addOperationWithBlock:^{
    [NSApp endSheet:_CardReadSheet];
    [_spinner stopAnimation:self];
}];
还有一个

- (void) endSheet:(NSWindow*)sheet returnCode:(NSInteger)returnCode contextInfo:(void*)ctxInfo {
    [sheet orderOut:self];
}
其中,
\u CardReadSheet
是我要显示的工作表,
\u window
是我要将工作表附加到的窗口,
\u spinner
是循环进度指示器

这似乎在第二次时效果很好;也就是说,如果我启动应用程序,读取卡上的数据,从读卡器中取出卡,然后再次读取,它工作正常

然而,第一次,它没有将其显示为附在我的主窗口上的一张纸,而是将
CardReadSheet
显示为在xib文件中指定的位置上的顶级窗口,而
[sheet orderOut:self]
行没有任何效果(该窗口保持在屏幕上)


我遗漏了什么?

确保它在启动或其他奇怪的选项集时不可见


在第一个块中设置一个断点,看看第一次通过时窗口是否为零,我怀疑是的。根据我的经验,当传递nil时,这些类型的sheet命令显示为一个单独的窗口

您可以确保在添加操作之前显示该窗口,或者使用self.window而不是_window。Self.window强制设置窗口,但如果您在其他地方假设窗口设置的时间,这可能会很棘手


无论哪种方式,请注意在块中引用self或ivar的注意事项。

谢谢,这确实是问题所在;关闭了Xib中的“启动时可见”,现在它已正确显示。我知道-我也为同一问题挣扎了数小时:D