2012-05-21 3 views
1

Я пишу многодокументное приложение с использованием Cocoa. Пользователь должен ввести пароль при открытии документа. По истечении определенного времени без действий на документе пользователю снова необходимо ввести пароль.Предотвратите сбор данных из фокуса

Сейчас я использую NSAplication's beginSheet:modalForWindow:modalDelegate:didEndSelector:contextInfo:, чтобы отобразить приглашение пароля на пользовательском листе. Несмотря на то, что он работает, у него есть неудачный побочный эффект окна, который выводится на передний план и фокусируется, даже если в то время работает другой документ. Это только проблематично, если мое приложение находится впереди.

Есть ли способ предотвратить открытие листа от захвата фокуса, если его родительское окно не активно?

+0

Может задержать показ листа, пока окно не станет ключом? –

+0

Это тоже сработает;) –

ответ

0

Существует не простой способ. Хакерным способом было бы сделать подкласс NSWindow для окна документа и окна листа, и в этом классе переопределить как orderFront: так и makeKeyWindow ничего не делать в течение времени, когда вы вызываете beginSheet. Например,

В NSWindow подкласса:

-(void)awakeFromNib 
{ 
    hack = NO; 
} 

-(void)hackOnHackOff:(BOOL)foo 
{ 
    hack = foo; 
} 

- (void)orderFront:(id)sender 
{ 
    if (!hack) 
     [super orderFront:sender]; 
} 

- (void)makeKeyWindow 
{ 
    if (!hack) 
     [super makeKeyWindow]; 
} 

И тогда ваш beginSheet вызов будет выглядеть следующим образом:

-(void)sheet 
{ 
    SpecialSheetWindow* documentWindow = [self windowForSheet]; 
    [documentWindow hackOnHackOff:YES]; 
    [sheetWindow hackOnHackOff:YES]; 
    [[NSApplication sharedApplication] beginSheet:sheetWindow 
         modalForWindow:documentWindow 
         modalDelegate:self didEndSelector:@selector(sheetDidEnd:returnCode:contextInfo:) contextInfo:nil]; 
    [documentWindow hackOnHackOff:NO]; 
    [sheetWindow hackOnHackOff:NO]; 
} 
+0

Да, это действительно было бы взломом, и я скорее избегу этого пути. Я думаю, что я буду использовать комбинацию предложения Кен Т, чтобы показывать только лист, когда окно становится ключевым и визуальным сигналом для пользователя (возможно, полупрозрачным наложением). Спасибо вам большое! – ims