Метод делегата UIActionsheet, вызывающий дважды в ios8?

В делегатах ios8 методы вызова UIActionSheet несколько раз

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

Я проверил ipad 2 с IOS 8

Ответ 1

Его ошибка ios 8..

Поскольку @rob говорит, что UIActionSheet устарел в iOS 8. (UIActionSheetDelegate также устарел.)

Чтобы создать и управлять листами действий в iOS 8 и более поздних версиях, используйте UIAlertController

Ответ 2

Это действительно текущее поведение, о котором я видел в нескольких местах. Кажется, это ошибка, и, надеюсь, скоро будет исправлено, но не знаю наверняка.

Ответ 3

Вы должны UIAlertController заменить все AlertView и ActionSheet в iOS8. Если ваша цель ниже iOS8, вам следует проверить версию и добавить еще код

Например, этот код предназначен для iOS8 ActionSheet

-(void)testActionSheet{
    UIAlertController* alertAS = [UIAlertController alertControllerWithTitle:@"Test ActionSheet"
                                                                   message:nil
                                                            preferredStyle:UIAlertControllerStyleActionSheet];

    UIAlertAction* defaultAction = [UIAlertAction actionWithTitle:@"Action" style:UIAlertActionStyleDefault
                                                          handler:^(UIAlertAction * action) {
                                                              NSLog(@"Action");
                                                          }];
    [alertAS addAction:defaultAction];
    UIAlertAction *cancleAction = [UIAlertAction actionWithTitle:@"Cancel" style:UIAlertActionStyleCancel handler:^(UIAlertAction *action) {

    }];
    [alertAS addAction:cancleAction];
    [self presentViewController:alertAS animated:YES completion:nil];

}

Ответ 4

Если вы хотите продолжать использовать существующий API, есть немного поведения, которое позволяет вам знать, когда запускать ваш код и когда игнорировать вызов делегата - buttonIndex.

При первом вызове методов делегата они всегда передают правильный buttonIndex. Во второй раз, однако, они вызываются с помощью кнопки buttonIndex кнопки отмены.

Ответ 6

У меня была такая же проблема. Один обход: используйте actionSheet.tag. Установите его на допустимое число (по умолчанию оно будет 0), например 1, 2,... при создании экземпляра. Обработать ответ в:

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

Проверьте, действительно ли это (ex: не -1 перед его обработкой). Как только реакция будет обработана здесь, перед возвратом установите:

actionSheet.tag = -1;

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

Ответ 7

Я хотел бы добавить: UIAlertController - это правильный способ использовать UIAlertViews в iOS8.0 + (поскольку UIAlertView устарел), однако ошибка в возможности выбора нескольких параметров несколько смягчена.

Отдельные параметры в представлении оповещения могут быть выбраны/выделены одновременно, но метод делегата только запускает один из них. Какой из них действительно срабатывает, не определено, но я могу подтвердить, что только один из них выключен, несмотря на то, что два или более выделены, если вы используете несколько пальцев.