2010-08-26 1 views
0

Я решил использовать оповещение с двумя кнопками. Когда пользователь нажимает кнопку «Продолжить», лист, сделанный из окна, должен опускаться. Лист опускается, и родительское окно закрывается вместе с другим листом. Код, который я использую:Вызов листа из предупреждения вызывает странные проблемы с окном

- (void)alertDidEnd:(NSAlert *)alert returnCode:(int)returnCode contextInfo:(int  *)contextInfo 
{ 
if (returnCode == kOkayButtonCode) { 
    NSUserDefaults* defaults = [NSUserDefaults standardUserDefaults]; 
    NSString *status = [defaults objectForKey:@"userStatus"]; 

    if (status == @"NO") { 
     [NSApp beginSheet:theSheet modalForWindow:window 
      modalDelegate:self didEndSelector:NULL contextInfo:nil]; 
    } 

    if (status == @"YES") { 

    } 
} 
if (returnCode == kCancelButtonCode) { 
    [NSApp performSelector:@selector(terminate:) withObject:nil afterDelay:0.45]; 
    } 
} 

Может ли кто-нибудь увидеть проблему с этим?

ответ

1

Обнаружено обходное решение с таймером.

- (void)alertDidEnd:(NSAlert *)alert returnCode:(int)returnCode contextInfo:(int   *)contextInfo 
{ 
if (returnCode == kOkayButtonCode) { 
NSUserDefaults* defaults = [NSUserDefaults standardUserDefaults]; 
NSString *status = [defaults objectForKey:@"userStatus"]; 

if (status == @"NO") { 
     NSDate *date = [NSDate dateWithTimeIntervalSinceNow:0.45]; 
     NSTimer *theTimer = [[NSTimer alloc] initWithFireDate:date 
                interval:1 
                target:self 
                selector:@selector(startSheet:) 
                userInfo:nil repeats:NO]; 

     NSRunLoop *runner = [NSRunLoop currentRunLoop]; 
     [runner addTimer:theTimer forMode: NSDefaultRunLoopMode]; 
     [timer2 release]; 
} 

if (status == @"YES") { 

} 
} 
if (returnCode == kCancelButtonCode) { 
[NSApp performSelector:@selector(terminate:) withObject:nil afterDelay:0.45]; 
    } 
} 


- (void)startSheet:(NSTimer *)theTimer { 
[NSApp beginSheet:theSheet modalForWindow:window 
    modalDelegate:self didEndSelector:NULL contextInfo:nil]; 
}