我已经加密了文件。在解归档每个文档之后,我需要提示用户从登录表中输入文档密码。我有办法根据文件内容验证密码输入(这部分已经完成)。如果密码不正确,文件将被关闭。如果密码正确,文档窗口将显示文档内容。
当我试图加载登录表(通过其控制器)在文档的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报告(见下文)