NSOpenPanel を使用して、ユーザーがドキュメントを保存するフォルダーを選択できるようにしています。保存できるフォルダを(階層的に)制限したいと思います。基本的に、上のフォルダーを選択できないようにしたい:
/ユーザー/ユーザー名/
だからフォルダ
/ユーザー/ユーザー名/猫/
許容されますが、
/ユーザー/ユーザー名/
/アプリケーション/猫/
許可されません。この制限をどのように実装するのか疑問に思っていました。
ありがとう。
NSOpenPanel を使用して、ユーザーがドキュメントを保存するフォルダーを選択できるようにしています。保存できるフォルダを(階層的に)制限したいと思います。基本的に、上のフォルダーを選択できないようにしたい:
/ユーザー/ユーザー名/
だからフォルダ
/ユーザー/ユーザー名/猫/
許容されますが、
/ユーザー/ユーザー名/
/アプリケーション/猫/
許可されません。この制限をどのように実装するのか疑問に思っていました。
ありがとう。
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;
}