2013-08-29 2 views
0

Я новичок в Cocoa. Теперь я хочу создать почтовый ящик в какао в iOS без кнопки. Автоматическое закрытие сообщений после NSTimer. Я использовал ниже код, но всегда добавлял кнопку «ОК». Пожалуйста, дайте мне какие-либо предложения. Заранее спасибо.Может создать NSAlert без кнопки в Cocoa

alert = [[[NSAlert alloc] init] autorelease]; 
    // [alert addButtonWithTitle: @"OK"]; 
    [alert setMessageText: @"Attention!!! This a critical Alert."]; 
    [alert setInformativeText:@"Scanning..."]; 
    [alert setAlertStyle: NSInformationalAlertStyle]; 

    NSTimer *myTimer = [NSTimer timerWithTimeInterval: 17.0 
               target:self 
              selector: @selector(killWindow:) userInfo:nil 
                   repeats:NO]; 

    [[NSRunLoop currentRunLoop] addTimer:myTimer forMode:NSModalPanelRunLoopMode]; 

    int choice = 0; 
    choice = [alert runModal]; 
    if(choice != 0) 
     [myTimer invalidate]; 

функция KillWindow:

-(void) killWindow: (NSTimer *) theTimer 
{ 
    NSLog(@"killWindow"); 
    [[alert window] close]; 
} 

И когда тревога близко, мое приложение не может нажать на любую кнопку или взаимодействие?

ответ

0

NSAlert предназначен для использования в качестве приложения или окна-модального отображения сообщения с кнопками для увольнения пользователей. Он не предназначен для отображения окон без кнопок; вы не должны использовать его таким образом.

Вы должны использовать пользовательский NSWindow/NSPanel. Если вы хотите, чтобы он блокировал окно/приложение, вам нужно будет запустить свой собственный модальный сеанс. Остановите сеанс модального сеанса от вашего обратного вызова по таймеру с помощью abortModal, в дополнение к закрытию окна, как вы делаете выше. Это объясняет, почему вы не получаете каких-либо дополнительных событий, когда предупреждение закрывается - модальный сеанс все еще запущен.

Для получения дополнительной информации см. How Modal Windows Work.

+0

Спасибо, но можете ли вы, например, код для меня? –

+0

[[NSApplication sharedApplication] beginSheet: scanningPanel modalForWindow: Окно modalDelegate: само didEndSelector: @selector (sheetDidEnd: код возврата: contextInfo :) contextInfo: ноль]; [[NSApplication sharedApplication] runModalForWindow: scanPanel]; –

+0

Я создал пользовательскую NSpanel, но я не знаю, как установить для нее NSTimer. Вы можете мне помочь? Большое спасибо –

1

Вы должны посмотреть на MBProgressHUD. Мое решение этой точной проблемы с использованием MBProgressHUD.

+ (void)showMessage:(NSString *)message forDuration:(NSTimeInterval)duration withTitle:(NSString *)title 
{ 
    UIWindow *window  = [UIApplication sharedApplication].keyWindow; 
    MBProgressHUD *hud = [MBProgressHUD showHUDAddedTo:window animated:YES]; 
    hud.mode    = MBProgressHUDModeText; 
    hud.labelText  = title; 
    hud.detailsLabelText = message; 

    hud.removeFromSuperViewOnHide = YES; 
    [hud hide:YES afterDelay:duration]; 
} 

После некоторых проверок пользователей было принято решение, что пользователям не понравилось длинное сообщение, которое они не могли уволить.

+ (void)showMessage:(NSString *)message forDuration:(NSTimeInterval)duration withTitle:(NSString *)title 
{ 
    if (duration < 3.0) { 
     UIWindow *window  = [UIApplication sharedApplication].keyWindow; 
     MBProgressHUD *hud = [MBProgressHUD showHUDAddedTo:window animated:YES]; 
     hud.mode    = MBProgressHUDModeText; 
     hud.labelText  = title; 
     hud.detailsLabelText = message; 

     hud.removeFromSuperViewOnHide = YES; 
     [hud hide:YES afterDelay:duration]; 
    } else { 
     UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:title 
                  message:message 
                  delegate:nil 
                cancelButtonTitle:@"OK" 
                otherButtonTitles:nil]; 
     [alertView show]; 

     int64_t delayInSeconds = duration; 
     dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, delayInSeconds * NSEC_PER_SEC); 
     dispatch_after(popTime, dispatch_get_main_queue(), ^(void){ 
      [alertView dismissWithClickedButtonIndex:alertView.cancelButtonIndex animated:YES]; 
     }); 
    } 
} 
+0

Нет, я реализую приложение MAC, а не приложение для iOS. –

+0

@JosonDaniel Извините, мой плохой. Тем не менее, базовый код - это модель, с которой вы можете основывать свое решение. –

0

после закрытия окна уведомления вы должны прервать модальность, а также с [NSApp abortModal]

Теперь это просто вопрос сокрытия этой кнопки. Для этого после создания оповещения вы можете просто просмотреть среди всех alert.window.contentView.subviews для NSButton, который имеет заголовок «ОК» и скрыть его.

Отказ от ответственности: это быстрый, уродливый взлом, но он работает ... пока. Используйте на свой страх и риск

5

Возможно, в 2013 году ответ будет отрицательным. Однако в текущем SDK (Xcode 7.0 с OS X 10.11) вы можете просто добавить «» с помощью addButtonWithTitle («»), тогда кнопка не будет отображаться.

0

Да, вы можете добавить новую кнопку. После этого вы получите его и спрячете :). Мой код

NSAlert* alert = [[NSAlert alloc] init]; 
[alert setMessageText:@"Loading...."]; 
[alert addButtonWithTitle:@"Cancel"]; 
NSButton *button = [[alert buttons] objectAtIndex:0]; 
[button setHidden:YES]; 
[alert setAccessoryView:[self viewLoadingReadFile]]; 
[alert setAlertStyle:NSWarningAlertStyle]; 
[alert runModal]; 
Смежные вопросы