Путь к файлу NSSavePanel
Я использую NSSavePanel только тогда, когда имею дело с текстовыми файлами. Если у меня есть изображение для экспорта, я использую NSOpenPanel, чтобы пользователь мог выбрать каталог, и меня не зацепило ограничение пути к файлу песочницы. На этот раз, однако, я хочу использовать NSSavePanel, чтобы позволить пользователю сохранить файл изображения (bmp, gif, jpeg, jp2, png).
- (void)exportfile {
NSString *documentFolderPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
NSSavePanel *panel = [NSSavePanel savePanel];
[panel setMessage:@"Please select a path where to save checkboard as an image."]; // Message inside modal window
if ([self fileExists:destinationpath]) {
[panel setDirectoryURL:[NSURL fileURLWithPath:destinationpath]];
} else {
[panel setDirectoryURL:[NSURL fileURLWithPath:documentFolderPath]];
}
//[panel setAllowedFileTypes:[[NSArray alloc] initWithObjects:@"bmp",@"gif",@"jpg",@"jp2",@"png",nil]];
[panel setAllowsOtherFileTypes:YES];
[panel setExtensionHidden:YES];
[panel setCanCreateDirectories:YES];
[panel setNameFieldStringValue:filename];
[panel setTitle:@"Saving checkboard..."]; // Window title
[panel setAccessoryView:accessoryView1];
NSInteger result = [panel runModal];
NSError *error = nil;
if (result == NSOKButton) {
////////////////////////////////////////////
NSString *path0 = [[panel URL] path];
NSMutableString *path1 = [[NSMutableString alloc] initWithString:path0];
if (formatIndex1 == 0) { // formatIndex1 is the index of NSPopMenu
[path1 appendString:@".bmp"];
}
else if (formatIndex1 == 1) {
[path1 appendString:@".gif"];
}
else if (formatIndex1 == 2) {
[path1 appendString:@".jpg"];
}
else if (formatIndex1 == 3) {
[path1 appendString:@".jp2"];
}
else if (formatIndex1 == 4) {
[path1 appendString:@".png"];
}
[self exportfile2:path1]; // <<<<<<<<<<<<<<< Immediate goal
////////////////////////////////////////////
if (error) {
[NSApp presentError:error];
}
}
}
Этот NSSavePanel имеет элемент управления AccessoryView, позволяющий пользователю выбирать графический формат с помощью NSPopupMenu. Его индекс - formatIndex1. Я знаю, что код не работает, если приложение находится в "песочнице". Это потому, что точный путь, который выбирает пользователь, это path0, и приведенный выше код добавляет расширение файла до достижения файла exportfile2. Итак, как мне получить точный путь с расширением файла. Предварительный просмотр автоматически добавляет расширение файла, если "Скрыть расширение" отключено. Тем не менее, предварительный просмотр не может не экспортировать изображение.
Спасибо за помощь.
1 ответ
Попробуйте вот так ниже:-
- (void)exportfile {
NSSavePanel *panel = [NSSavePanel savePanel];
NSString *fileName=nil;
if (formatIndex1 == 0) { // formatIndex1 is the index of NSPopMenu
fileName=@"untitle.bmp"
}
else if (formatIndex1 == 1) {
fileName=@"untitle.gif"
}
else if (formatIndex1 == 2) {
fileName=@"untitle.jpg"
}
[panel setMessage:@"Please select a path where to save checkboard as an image."]; // Message inside modal window
[panel setAllowsOtherFileTypes:YES];
[panel setExtensionHidden:YES];
[panel setCanCreateDirectories:YES];
[panel setNameFieldStringValue:filename];
[panel setTitle:@"Saving checkboard..."]; // Window title
[panel setAccessoryView:accessoryView1];
NSInteger result = [panel runModal];
NSError *error = nil;
if (result == NSOKButton) {
////////////////////////////////////////////
NSString *path0 = [[panel URL] path];
[self exportfile2:path0]; // <<<<<<<<<<<<<<< Immediate goal
////////////////////////////////////////////
if (error) {
[NSApp presentError:error];
}
}
}