在Mac OS X 10.8 Mountain Lion上不调用方法

时间:2014-12-12 13:00:15

标签: objective-c macos

我正在尝试创建可以在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];
    }];
}

1 个答案:

答案 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!!
    }
}];