目标C - 在你退出之前要求保存

时间:2015-08-18 22:45:14

标签: objective-c macos cocoa

我正在使用Objective-C / Cocoa文本编辑器(它是一个mac应用程序,而不是iOS)。

当前有人试图在没有保存的情况下退出时,我正面临着一个对话。

我已经有一个名为issavedsomewhere的共享bool,用于判断用户是否已保存。我甚至将textview数据作为共享变量提供,因此我可以从任何类访问它。

我想我会将保存对话框放在(void)applicationWillTerminate方法中。

我当前的保存代码很简单:

NSSavePanel *panel = [NSSavePanel savePanel];
    // NSInteger result;

    [panel setAllowedFileTypes:@[@"txt"]];
    [panel beginWithCompletionHandler:^(NSInteger result){

        //OK button pushed
        if (result == NSFileHandlingPanelOKButton) {
            // Close panel before handling errors
            [panel orderOut:self];
            // Do what you need to do with the selected path

            NSString *selpath = [[panel URL] path];

            NSError *error;

            BOOL didOK = [[theDATA.textvieww string]writeToFile:selpath atomically:NO encoding:NSUTF8StringEncoding error:&error];

            if(!didOK){
                //error while saving
                NSLog(@"Couldn't Save!!! -> %@", [error localizedFailureReason]);

            }else{
                //success!
                theDATA.issavedsomewhere=YES;
                theDATA.filepath=selpath;
                theDATA.filename=[[[panel URL] path] lastPathComponent];
            }

        }/*Button other than the OK button was pushed*/
        else{


        }
    }];

只需弹出一个NSSavePanel,询问您要保存的位置。

问题在于,当我将其添加到(void)applicationWillTerminate时,它不会等待用户回答。

感谢您的帮助和想法:)

2 个答案:

答案 0 :(得分:0)

一种可能性是只保存在临时文件中并在启动时检查以查看临时文件是否存在,并且可能询问用户是否要使用它。

答案 1 :(得分:0)

在Cocoa框架中有更好的方法可以做到这一点,例如使用NSDocument及其同类。但是,可以做你想做的事。

您首先要在NSTerminateLater中返回applicationShouldTerminate:

- (NSApplicationTerminateReply)applicationShouldTerminate:(NSApplication *)sender
{
    if (theDATA.issavedsomewhere) {
       return NSTerminateLater;
    }
    return NSTerminateNow;
}

然后,处理程序最终应该在[NSApp replyToApplicationShouldTerminate:YES]完成后调用:

NSSavePanel *panel = [NSSavePanel savePanel];
    // NSInteger result;

    [panel setAllowedFileTypes:@[@"txt"]];
    [panel beginWithCompletionHandler:^(NSInteger result){

        //OK button pushed
        if (result == NSFileHandlingPanelOKButton) {
            // Close panel before handling errors
            [panel orderOut:self];
            // Do what you need to do with the selected path

            NSString *selpath = [[panel URL] path];

            NSError *error;

            BOOL didOK = [[theDATA.textvieww string]writeToFile:selpath atomically:NO encoding:NSUTF8StringEncoding error:&error];

            if(!didOK){
                //error while saving
                NSLog(@"Couldn't Save!!! -> %@", [error localizedFailureReason]);

            }else{
                //success!
                theDATA.issavedsomewhere=YES;
                theDATA.filepath=selpath;
                theDATA.filename=[[[panel URL] path] lastPathComponent];
            }

        }/*Button other than the OK button was pushed*/
        else{


        }
        [NSApp replyToApplicationShouldTerminate:YES];
    }];