提示用户登录以获取加密文档



我已经加密了文件。在解归档每个文档之后,我需要提示用户从登录表中输入文档密码。我有办法根据文件内容验证密码输入(这部分已经完成)。如果密码不正确,文件将被关闭。如果密码正确,文档窗口将显示文档内容。

当我试图加载登录表(通过其控制器)在文档的windowControllerDidLoadNib方法我有无法识别的选择器错误,如下所示:

- (void)windowControllerDidLoadNib:(NSWindowController *)aController
{
    [super windowControllerDidLoadNib:aController];
    if (!newPasswordController){
        newPasswordController = [[NewPasswordController alloc] init];
        newPasswordSheet = [newPasswordController window];
    }
    [NSApp beginSheet:newPasswordSheet modalForWindow:[self window]
        modalDelegate:self
       didEndSelector:@selector(didNewPasswordEnd:returnCode:contextInfo:) 
          contextInfo:nil];
}
[_NSControllerObjectProxy copyWithZone:]: unrecognized selector sent to instance 

方法[NewPasswordController init]的实现如下:

-(id)init
{
    self = [super initWithWindowNibName:@"NewPassword"];
    if (self) {
    }
    return self;
}

,其中登录表笔尖文件称为NewPassword

我想知道出了什么问题。解决这个问题的最好方法是什么?

除了unrecognized selector问题(我离开苹果),我设法解决了原来的问题Prompting the user to logon for encrypted documents,这里是解决方案。

注意每个文档都有密码保护,它们可能会响应不同的密码(所以问题不是"密码保护的应用程序",而是"密码保护的文档")。

当我们要读取文档内容时,只需注入以下代码,就会弹出一个应用程序模态窗口来验证文档密码:

- (BOOL)readFromData:(NSData *)data 
        ofType:(NSString *)typeName 
        error:(NSError **)outError 
{
   PasswordController *passwordController = [[PasswordController alloc] init];
   NSWindow *passwordSheet = [passwordController window];
   NSApplication* app = [NSApplication sharedApplication];
   NSInteger iret = [app runModalForWindow:passwordSheet];
   NSLog(@"password dialog returned = %ld", iret);
   if (iret != 0)
   {
       [app stop:self];
       return NO;
   }
   [passwordController release];
   ...

您也可以在dataOfType中第一次保存文档时弹出另一种窗口,强制用户设置文档的密码。

这个问题现在有答案了

在我从头开始构建xib文件后,unrecognized selector问题得到了解决。这表明了XCode 4中关于IB的一个严重问题,因为在这两种情况下,表的属性和创建绑定、键值等的步骤似乎是相同的。在我的第一次尝试中,我在IB接口构建期间所做的事情导致了xib文件的损坏。

我将留给论坛管理员来删除或保留这个问题。如果它对任何人都有价值,我会向苹果提交bug报告(见下文)

最新更新