2013-04-30 3 views
0

Я использую UIActionSheet, чтобы выбрать один из нескольких вариантов обмена (facebook, твиттер, почта)Ios UIActionSheet дает предупреждение при увольнении

Но после того, как я выбираю вариант, я получаю это предупреждение об

Warning: Attempt to dismiss from view controller <UINavigationController: 0x1ed7eaf0> while a presentation or dismiss is in progress 

Этот это код я использую:

- (void)actionSheet:(UIActionSheet *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex 
{ 
    //BOOL displayedNativeDialog; 
    SLComposeViewController * tw = [SLComposeViewController composeViewControllerForServiceType:SLServiceTypeTwitter]; 
    //TWTweetComposeViewController * tw = [[TWTweetComposeViewController alloc]init]; 
    tw.completionHandler = ^(TWTweetComposeViewControllerResult result) 
    { 
     [self dismissViewControllerAnimated:YES completion:nil]; 
    }; 

    SLComposeViewController * fb = [SLComposeViewController composeViewControllerForServiceType:SLServiceTypeFacebook]; 
    fb.completionHandler = ^(SLComposeViewControllerResult result) 
    { 
     [self dismissViewControllerAnimated:YES completion:nil]; 
    }; 

    MFMailComposeViewController * mail = [[MFMailComposeViewController alloc]init]; 
    [mail setMailComposeDelegate:self]; 
    [mail.navigationBar setBackgroundColor:[UIColor blackColor]]; 
    NSData * imageData = [NSData dataWithData:UIImagePNGRepresentation(previewImageView.image)]; 
    switch (buttonIndex) { 
     case 0: 
      UIImageWriteToSavedPhotosAlbum(previewImageView.image, nil, nil, nil); 
      break; 
     case 1: 
      [fb addImage:previewImageView.image]; 
      [self presentViewController:fb animated:YES completion:nil]; 
      fb = nil;  
      break; 
     case 2: 
      [actionSheet dismissWithClickedButtonIndex:-1 animated:YES]; 
      [tw addImage:previewImageView.image]; 
      [self presentViewController:tw animated:YES completion:nil]; 
      break; 
     case 3: 
      [mail addAttachmentData:imageData mimeType:@"image/png" fileName:@"Image.png"]; 
      [self presentViewController:mail animated:YES completion:nil]; 
      break; 

     default: 
      break; 
    } 
} 

Я также попытался с помощью функции делегата:

- (void)actionSheet:(UIActionSheet *)actionSheet didDismissWithButtonIndex:(NSInteger)buttonIndex 

Но я получил то же предупреждение.

+0

Зачем создавать все эти 'SLComposeViewController' и' MFMailComposeViewController', если вы собираетесь использовать их? – rog

+0

Можете ли вы опубликовать строку кода, в которой вы показываете лист действий? – csundman

+0

Удалить '[actionSheet rejectWithClickedButtonIndex: -1 анимированный: YES];' – rog

ответ

2

1) Вы должны Ивар держать сильные ссылки на них:

SLComposeViewController * tw  
SLComposeViewController * fb  
MFMailComposeViewController * mail 

Его плохая форма, чтобы создать их, то просто дайте ARC перерабатывают их - почему бы не создать только один (ы), необходимо в зависимости от выбранный вариант? Вы можете создавать объекты в случае заявления с:

case 1: 
{ 
    NSObject *obj = .... 
    .... 
} break; 

2) Вам не нужно уволить actionSheet - нажмите на кнопку будет делать это.

3) Не представляйте контроллер представления в делегат вызова actionSheet, опубликовать блок в основной очереди, чтобы сделать это:

dispatch_async(dispatch_get_main_queue(),^{ 
    [self presentViewController:tw animated:YES completion:nil]; 
}); 

Это вроде как положить эту строку в метод, то do performSelectorOnMainThread:

+0

srry Я довольно новичок в разработке ios Как разместить блок в главной очереди? –

+0

Я сделал, как вы сказали, но она по-прежнему не работает это код, который я использовал: случай 2: { [ТВт addImage: previewImageView.image]; dispatch_async (dispatch_get_main_queue(),^{ [self presentViewController: tw animated: YES завершение: ноль]; }); break; } –

+0

Проблема была исправлена ​​после того, как я объявил viewcontrollers в случаях коммутатора, как вы указали в пункте 1. Я не знаю, почему это было проблемой, но я рад, что это исправлено: D –

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