我正在使用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
时,它不会等待用户回答。
感谢您的帮助和想法:)
答案 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];
}];