2015-02-17 2 views
0

У меня есть что-то вроде следующего кода. Лист действия запускает doSomething OK, когда он появляется в первый раз (в кнопке IBAction), но когда он появляется второй раз, ничего не происходит, действие листа просто исчезает, не вызывая чего-то делать. Есть идеи?Лист действий UIAlerController не отвечает во второй раз, когда он называется

@implementation ... 

- (void) setActions { 
    UIAlertAction *opt1 = [UIAlertAction actionWithTitle:@"Option 1" style:UIAlertActionStyleDefault handler:^(UIAlertAction *action) { 
      [self doSomething:@"opt1"];}]; 

    UIAlertAction *opt2 = [UIAlertAction actionWithTitle:@"Option 2" style:UIAlertActionStyleDefault handler:^(UIAlertAction *action) { 
      [self doSomething:@"opt2"];}]; 

    UIAlertAction *opt3 = ... 

    self.opt1 = opt1; 
    self.opt2 = opt2; 
    self.opt3 = opt3; 

- (void) showActionSheet { 

    ... 
UIAlertController *selectAS = [UIAlertController alertControllerWithTitle:@"Select Options" 
message:@"msg" preferredStyle:UIAlertControllerStyleActionSheet]; 

    if (xyz) {     
      [selectAS addAction:self.opt1]; 
      [selectAS addAction:self.opt2]; 
     } 
    else{    
      [selectAS addAction:self.opt1]; 
      [selectAS addAction:self.opt3];      
     } 
    [self presentViewController:selectqAS 
    animated:YES completion:nil]; 
     } 

- (void) doSomething: (NSString *) opt{ 



    .... 
    } 
+1

Ваш синтаксис очень смущает меня. Изображение, глядя на ваш код через год, вы сами не будете знать, что происходит. Apple представила UIAlertController, потому что она включает обработчики завершения в более надежном элегантном стиле, в отличие от своего аналога. Вы должны использовать его таким образом, вместо того чтобы иметь разные методы для всего. Все это можно сделать в одном фрагменте кода. Просто создайте/настройте/и представите UIAlertController внутри IBAction. – soulshined

+0

По причинам, не зависящим от меня, ваше предложение сработало. Тот же код внутри IBAction был в порядке. Спасибо (вы можете отправить его в качестве ответа) –

ответ

1

Рад, что мы заставили вас работать. Я предполагаю, что ваши методы теряются в переводе. У вас есть методы, переплетающиеся друг с другом, что может вызвать путаницу, в частности с self.opt1. на мой комментарий, теперь iOS8 представила UIAlertController, она поставляется с обработчиков завершения, вы должны планировать соответственно, что: что-то вроде следующего:

-(IBAction)showActionSheet { 
    UIAlertController *selectAS = [UIAlertController alertControllerWithTitle:@"Select Options" message:@"msg" preferredStyle:UIAlertControllerStyleActionSheet]; 

    UIAlertAction *opt1 = [UIAlertAction actionWithTitle:@"Option 1" style:UIAlertActionStyleDefault handler:^(UIAlertAction *action) { 
     //Don't have to call another method, just put your action 1 code here. This is the power of completion handlers creating a more structured outline 
    }]; 

    UIAlertAction *opt2 = [UIAlertAction actionWithTitle:@"Option 2" style:UIAlertActionStyleDefault handler:^(UIAlertAction *action) { 
     //Don't have to call another method, just put your action 2 code here. This is the power of completion handlers creating a more structured outline 
    }]; 

    UIAlertAction *opt3 = ... 

    if (xyz) { 
     [selectAs addAction:opt1]; 
     [selectAs addAction:opt2]; 
    } else { 
     [selectAs addAction:opt1]; 
     [selectAs addAction:opt3]; 
    }   

    [self presentViewController:selectAs animated:YES completion:nil]; 

} 

Гораздо более чистых и фактически использует UIAlertController для она предназначена целей, не нужны другие вызовы.

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