5

NSOpenPanel を使用して、ユーザーがドキュメントを保存するフォルダーを選択できるようにしています。保存できるフォルダを(階層的に)制限したいと思います。基本的に、上のフォルダーを選択できないようにしたい:

/ユーザー/ユーザー名/

だからフォルダ

/ユーザー/ユーザー名/猫/

許容されますが、

/ユーザー/ユーザー名/

/アプリケーション/猫/

許可されません。この制限をどのように実装するのか疑問に思っていました。

ありがとう。

4

1 に答える 1

16

NSOpenPanelはから継承されNSSavePanel、次にデリゲートと対応するデリゲート プロトコルを定義することに注意してくださいNSOpenSavePanelDelegate。デリゲートを使用して、開いているパネルの動作を拡張し、質問に記載した制限を含めることができます。

たとえば、アプリケーション デリゲートがオープン パネルの制限を実装すると仮定すると、次のNSOpenSavePanelDelegateプロトコルに準拠させます。

@interface AppDelegate : NSObject <NSApplicationDelegate, NSOpenSavePanelDelegate>
@end

アプリケーション デリゲートの実装で、アプリケーション デリゲートがオープン パネル デリゲートとして機能することをオープン パネルに伝えます。

NSOpenPanel *openPanel = [NSOpenPanel openPanel];
[openPanel setDirectory:NSHomeDirectory()];
[openPanel setCanChooseDirectories:NO];
[openPanel setDelegate:self];
[openPanel runModal];

そして、次のデリゲート メソッドを実装します。

- (BOOL)panel:(id)sender shouldEnableURL:(NSURL *)url {
    NSString *path = [url path];
    NSString *homeDir = NSHomeDirectory();

    return [path hasPrefix:homeDir] && ! [path isEqualToString:homeDir];
}

- (void)panel:(id)sender didChangeToDirectoryURL:(NSURL *)url {
    NSString *path = [url path];
    NSString *homeDir = NSHomeDirectory();

    // If the user has changed to a non home directory, send him back home!
    if (! [path hasPrefix:homeDir]) [sender setDirectory:homeDir];
}

- (BOOL)panel:(id)sender validateURL:(NSURL *)url error:(NSError **)outError {
    NSString *path = [url path];
    NSString *homeDir = NSHomeDirectory();

    if (![path hasPrefix:homeDir]) {
        if (outError)
           *outError = ; // create an appropriate NSError instance

        return NO;    
    }
    return YES;
}
于 2011-04-15T22:21:51.363 に答える