我正在尝试创建可以在Mac OS X 10.8上使用的小应用程序。
在Mac OS X Mavericks和Mac OS X Yosemite上,我的应用程序运行良好,但在Mac OS X 10.8上,我的应用程序的主要方法没有被调用。确切地说,这种方法似乎是瞬间引用的,但是在用警报声杀死后不久。 我知道Mac OS X 10.8比之后的操作系统有点严格。但我认为我的代码有些问题我无法找到。
我的主要方法是可以的,因为如果直接调用它,它可以正常工作而没有任何问题。但是如果我在通知选择器的方法中调用它,就会出现问题。
这是我的代码。我感谢任何建议,谢谢。
- (IBAction)startButton:(id)sender {
NSUserDefaults *defaults=[NSUserDefaults standardUserDefaults];
if ( [[defaults objectForKey:@"aBookMark"] length] == 0 ) {
[self getAudioCDPath];
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(runEncodeAsyncWithNotify:)
name:NSWindowDidEndSheetNotification
object:self.window];
} else {
[self runEncodeAsync];
}
}
/* This method have problem */
-(void)runEncodeAsyncWithNotify:(NSNotification *)notification {
[[NSNotificationCenter defaultCenter] removeObserver:self
name:NSWindowDidEndSheetNotification
object:self.window];
encodingFlag = YES;
[_start setEnabled: NO];
[_stop setEnabled: YES];
NSOperationQueue *queue = [[NSOperationQueue alloc] init];
[queue addOperationWithBlock:^{
[self encodeWithLAME];
}];
}
/* This method does not have any problem */
-(void)runEncodeAsync {
encodingFlag = YES;
[_start setEnabled: NO];
[_stop setEnabled: YES];
NSOperationQueue *queue = [[NSOperationQueue alloc] init];
[queue addOperationWithBlock:^{
[self encodeWithLAME];
}];
}
答案 0 :(得分:0)
我的错误是使用NSWindowDidEndSheetNotification
作为工作表关闭通知。 [self getAudioCDPath]
是一种显示工作表OpenPanel的方法,它本身有completionHandler:
块。
由于我想要做的只是调用[self runEncodeAsync]
,我应该在completionHandler:
块中编写它。无需使用NSWindowDidEndSheetNotification
。
所以,这里修改了getAudioCDPath
的代码。对不起,我没有在问题中显示它。
[aPanel beginSheetModalForWindow:self.window completionHandler:^(NSInteger result) {
if (result == NSFileHandlingPanelOKButton) {
NSUserDefaults *defaults=[NSUserDefaults standardUserDefaults];
NSURL *aDirURL = [[aPanel URLs] objectAtIndex:0];
NSData *bookmark = nil;
NSError *error = nil;
bookmark = [aDirURL bookmarkDataWithOptions:NSURLBookmarkCreationWithSecurityScope
includingResourceValuesForKeys:nil
relativeToURL:nil
error:&error];
if (error) {
NSLog(@"Error creating bookmark for URL (%@): %@", aDirURL, error);
}
[defaults setObject:bookmark forKey:@"aBookMark"];
[self runEncodeAsync]; // I added this to invoke main method!!
}
}];