2013-07-26 2 views
1

Я бы хотел, чтобы у пользователя появился экран подсказки, у него были бы да и нет параметров. Проблема UIAlertView не может быть вызвана из дочернего потока, если я вызываю ее из дочернего потока. Я получаю ошибку времени выполнения (EXC_BAD_ACCESS). Я использую NSThread на IOS6.1Кнопка UIAlertView дает ребенку NSThread

Это код, который я использую

-(void) construct 
{ 
    NSThread *initThread =[[NSThread alloc]initWithTarget:self selector:@selector(error) object:nil]; 
    [initThread start]; 
} 

- (void) error 
{ 
    //make sure it runs on the main thread 
    dispatch_async(dispatch_get_main_queue(), ^{ 

     UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"Save" 
                  message:@"Enter File Name" 
                  delegate:self 
                cancelButtonTitle:@"Cancel" 
                otherButtonTitles:@"OK", nil]; 

     alertView.alertViewStyle = UIAlertViewStylePlainTextInput; 

     [alertView show]; 
    }); 
} 

- (void)alertView:(UIAlertView *)alertView didDismissWithButtonIndex:(NSInteger)buttonIndex 
{ 
    NSLog(@"Alert View dismissed with button at index %d",buttonIndex); 

    switch (alertView.alertViewStyle) 
    { 
     case UIAlertViewStylePlainTextInput: 
     { 
      UITextField *textField = [alertView textFieldAtIndex:0]; 
      NSLog(@"Plain text input: %@",textField.text); 
     } break; 
     case UIAlertViewStyleSecureTextInput: 
     { 
      UITextField *textField = [alertView textFieldAtIndex:0]; 
      NSLog(@"Secure text input: %@",textField.text); 
     } break; 
     case UIAlertViewStyleLoginAndPasswordInput: 
     { 
      UITextField *loginField = [alertView textFieldAtIndex:0]; 
      NSLog(@"Login input: %@",loginField.text); 

      UITextField *passwordField = [alertView textFieldAtIndex:1]; 
      NSLog(@"Password input: %@",passwordField.text); 
     }break; 
     default: break; 
    } 
} 

Это ошибка, что я получаю:

[NSURLCacheInternal alertView:didDismissWithButtonIndex:]: unrecognized selector sent to instance 0x8653630 
2013-07-26 16:12:35.738 iOSTrack[7455:c07] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[NSURLCacheInternal alertView:didDismissWithButtonIndex:]: unrecognized selector sent to instance 0x8653630' 
*** First throw call stack: 
(0x1e7a012 0x1796e7e 0x1f054bd 0x1e69bbc 0x1e6994e 0x7c0e13 0x408d66 0x408f04 0x20e7d8 0x266b014 0x265b7d5 0x1e20af5 0x1e1ff44 0x1e1fe1b 0x1dd47e3 0x1dd4668 0x3caffc 0x21cd 0x20f5) 
libc++abi.dylib: terminate called throwing an exception 
+0

это, где произошел сбой? на самом деле код работал отлично для меня –

+0

Он будет работать нормально. или, пожалуйста, укажите более подробную информацию о версии ios и обо всем. –

ответ

1

Скорее всего, что происходит в том, что ваш UIAlertView является локальной переменной, и он уничтожается до того, как у делегата есть шанс на запуск. Вам нужно держать ссылку на нее достаточно долго, чтобы у вашего делегата была возможность работать и выполнять свою работу. Тогда вы в ясности. Эта концепция применима как к ARC, так и к управляемому вручную коду.

Смотрите этот родственный вопрос: UIAlertViewDelegate class "self" instance gets dealloc'd before button gets pressed

+0

Спасибо, вот что я сделал сейчас, использовал простое логическое значение, инициализированное значением false и изменил его значение на true в конце функции alert, в то время как оно ложно, спать за 100 мс –

0

Код я пытался на самом деле работал отлично для меня

Единственным отличием является

[alertView show] =>[alertView show]; вы пропустите ;, опечатка в вопросе я думаю,

код двигателя в отдельной резьбе

dispatch_queue_t myQueue = dispatch_queue_create("My Queue",NULL); 
    dispatch_async(myQueue, ^{ 
     // Perform long running process 
     [self error]; 
    }); 

- (void) error { 
    //make sure it runs on the main thread 
    dispatch_async(dispatch_get_main_queue(), ^{ 

     UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"Save" 
                  message:@"Enter File Name" 
                  delegate:self 
                cancelButtonTitle:@"Cancel" 
                otherButtonTitles:@"OK", nil]; 

     alertView.alertViewStyle = UIAlertViewStylePlainTextInput; 

     [alertView show]; 
    }); 
} 
+0

Я использую NSThread не в очереди Также я пробовал очередь, результат не изменился. –

 Смежные вопросы

  • Нет связанных вопросов^_^