更改NSOpenPanel在创建文件夹时使用的默认名称?

时间:2013-02-27 05:13:18

标签: objective-c macos cocoa nsopenpanel

我正在使用NSOpenPanel,面板上有一个“新建文件夹”按钮。当我点击按钮时,它会显示“无标题文件夹”。我如何设置我选择的文件夹名称?

这是我现在正在使用的代码:

NSOpenPanel* openDlg = [NSOpenPanel openPanel];
[openDlg setCanChooseFiles:NO];
[openDlg setAllowsMultipleSelection:NO];
[openDlg setCanChooseDirectories:TRUE];
[openDlg setCanCreateDirectories:YES];
[openDlg setTitle:@"Choose folder..."];

1 个答案:

答案 0 :(得分:0)

您可以使用objective-c运行时实现此目的。NSSavePanel正在使用NSNavNewFolderController类创建新文件夹对话框。

//
//  PBSavePanel.h
//  PBSavePanel
//
//  Created by Parag on 28/02/13.
//  Copyright 2013 __MyCompanyName__. All rights reserved.
//

#import <Cocoa/Cocoa.h>


@interface NSSavePanel (NewFolderButton)
-(void)setDefaultNewFolderName : (NSString *)name;// change default folder name
-(void)setIncludeNewFolderButton: (BOOL)value; // show/hide new folder button
@end
//
//  PBSavePanel.m
//  PBSavePanel
//
//  Created by Parag on 28/02/13.
//  Copyright 2013 __MyCompanyName__. All rights reserved.
//

#import "PBSavePanel.h"
#import <objc/runtime.h>

@implementation NSSavePanel (NewFolderButton)
static NSMutableString *mfolderName;
static BOOL shouldNotOverride;
-(void)setDefaultNewFolderName : (NSString *)name;
{
    if (!shouldNotOverride) {
        shouldNotOverride =YES;
        [self overrideFunctions:NSClassFromString(@"NSNavNewFolderController") sourceFunction:@selector(_defaultNewFolderName)  customClass:[self class] newFunction:@selector(_defaultNewFolderNameNew)];
    }
    if (mfolderName==nil) {
        mfolderName = [[NSMutableString alloc] init];
    }
    [mfolderName setString:name];

}
-(void)setIncludeNewFolderButton: (BOOL)value;
{
    [self _setIncludeNewFolderButton:value];
}
-(void) overrideFunctions:(Class)actualClass sourceFunction:(SEL)actualFunction customClass:(Class) customClass newFunction:(SEL)newFunction
{

    NSAutoreleasePool *pool=[[NSAutoreleasePool alloc]init];
    Method actualDefinitionInActualClass = class_getInstanceMethod(actualClass, actualFunction);
    Method newDefinitionInCustomClass=class_getInstanceMethod(customClass, actualFunction);
    const char* oldEncoding=method_getTypeEncoding(actualDefinitionInActualClass);
    IMP oldImplementation=method_setImplementation(actualDefinitionInActualClass,method_getImplementation(newDefinitionInCustomClass));
    class_addMethod(actualClass, newFunction, oldImplementation, oldEncoding);
    class_addMethod(class_getSuperclass(actualClass), newFunction, oldImplementation, oldEncoding);
    [pool drain];

}

-(NSString *)_defaultNewFolderName
{
    return  mfolderName;
}
-(void)dealloc
{
    if (mfolderName) {
        [mfolderName release];
    }
    [super dealloc];

}
@end

输出

NSSavePanel *panel = [NSSavePanel savePanel];
[panel setDefaultNewFolderName:@"Parag"];
NSInteger result    = [panel runModal];

if (result == NSFileHandlingPanelOKButton) {
    //NSArray *urls = [panel URLs];
    [panel orderOut:nil];  

}

enter image description here