我想学习NSObject可能属于哪个类( NSAlert、NSOpenPanel和NSSavePanel除外),以便响应上述调用(如问题标题)。下面是我需要做的事情。菜单选择的操作必须是self.window的模式,它需要以比"OK/Cancel“更详细的对话框形式进行额外的用户输入(例如,为了简单起见,省略了实际的工作代码):
- (IBAction)myActionDialog:(id)sender
{
NSPanel *panel = self.myActionPanel;
[panel beginSheetModalForWindow:self.window completionHandler:^(NSInteger result) {
;
if (result == 0){
;
}
}];
}但是,编译器警告:
'NSPanel may not respond to beginSheetModalForWindow:completionHandler'事实证明这是真的,但我不知道如何解决这个问题,并编写所需的行为代码。我一直在寻找合适的文档,但到目前为止什么也没找到。任何有经验的建议都很受欢迎。提前感谢!
更新:
这个问题涉及:
[[NSApplication sharedApplication] beginSheet: modalForWindow: modalDelegate: didEndSelector:
contextInfo: ]方法,它适用于几乎所有的NSPanel子类,AFAICT。唯一的问题是,苹果在宣布遭到反对的同时,还没有恰当地记录下一种可以普遍取代它的替代方法,AFAIK。
发布于 2015-03-11 16:55:08
苹果已经记录了-[NSApplication beginSheet:...]的替代品。这是NSWindow上的新方法
-beginSheet:completionHandler:
-beginCriticalSheet:completionHandler:
-endSheet:
-endSheet:returnCode:在你的情况下,你会:
[self.window beginSheet:panel completionHandler:^(NSInteger result) {
if (result == 0){
;
}
}];发布于 2015-03-16 19:32:12
这是我对这个问题的回答,以下是我对这个问题的个别研究。我发现仔细实现自定义表的一个主要问题是在旧的基于模式委托的代码的废弃和失效之间突然而无声的转换,这种转换肯定发生在10.8的某个时候。它导致了一个关键的兼容性问题,需要简单的代码分支并避免过度实现新的API枚举,除非确实出于某种原因需要。我知道这样的概念可能是不同意的,但这里有一个建议。我使用Gestalt()命令,因为它适用于10.7到10.10之间的所有系统。注意到有一些更新的、更好的、更复杂的方法来确定OS运行时,下面是具有更多相关信息的链接:https://developer.apple.com/library/mac/releasenotes/AppKit/RN-AppKit/
为了简单起见,我发布了这篇文章,省略了头声明和接口构建器细节。希望这是清楚的,尽管:
SInt32 versionMinor;
- (void)applicationDidFinishLaunching:(NSNotification *)aNotification
{
versionMinor = 0;
Gestalt(gestaltSystemVersionMinor, &versionMinor);
NSLog(@"Version Minor: %d\n", (int)versionMinor);
}活页投寄法:
- (IBAction)postSheet:(id)sender
{
if(versionMinor > 8){
[self.window beginSheet:self.sheet completionHandler:^(NSInteger result) {
if (result == 1) [self doSomething];
if (result == 0) [self doNothing];
}];
}else [[NSApplication sharedApplication] beginSheet:self.sheet
modalForWindow:self.window
modalDelegate:self
didEndSelector:@selector(sheetDidEnd:returnCode:contextInfo:)
contextInfo:nil
];
}OK按钮按下IBAction:
- (IBAction)ok:(id)sender
{
[self.sheet orderOut:self];
if(versionMinor > 8){NSLog(@">OK Button pressed\n");
[self.window endSheet:self.sheet returnCode:1];
}else{ NSLog(@"<OK Button pressed\n");
[NSApp endSheet:self.sheet returnCode: 1];
}
}同样,对于按下IBAction的“取消”按钮:
- (IBAction)cancel:(id)sender
{
[self.sheet orderOut:self];
if(versionMinor > 8){ NSLog(@">Cancel Button pressed\n");
[self.window endSheet:self.sheet returnCode:0];
}else{ NSLog(@"<Cancel Button pressed\n");
[NSApp endSheet:self.sheet returnCode: 0];
}
}最后,“遗留”didEndSelector (用于10.8之前)。(运行时)
- (void)sheetDidEnd : (NSPanel*)panel returnCode:(NSInteger)returnCode contextInfo:(void*)contextInfo
{
if (returnCode == 1) [self doSomething ];
if (returnCode == 0) [self doNothing ];
}这适用于10.7到10.10,用10.8或10.10 SDK构建。在学术界和科学界,OSX 10.7和10.8仍然被大量使用。希望有人能发现这有帮助。感谢大家的贡献和评论。
https://stackoverflow.com/questions/28927678
复制相似问题