iPad UIActionSheet - не отображается последняя добавленная кнопка - PullRequest
7 голосов
/ 06 октября 2011

Я пытаюсь отобразить UIActionSheet с моего iPad. Вот код, который я использую:

-(void) presentMenu {
    UIActionSheet *popupMenu = [[UIActionSheet alloc] initWithTitle:@"Menu" delegate:self cancelButtonTitle:@"Cancel" destructiveButtonTitle:nil otherButtonTitles:nil];
    for (NSString *option in _menuItems) {
        [popupMenu addButtonWithTitle:option];
    }
    popupMenu.actionSheetStyle = UIActionSheetStyleBlackOpaque;
    if(UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone) {
        [popupMenu showFromTabBar:_appDelegate.tabBar.tabBar];
    }
    else if(UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) {
        [popupMenu showFromBarButtonItem:self.navigationItem.rightBarButtonItem animated:YES];
    }
    [popupMenu release];
    return;
}

Версия программы для iPhone отображает все кнопки в _menuItems, но версия для iPad просто игнорирует последний элемент из этого массива. Кто-нибудь знает, почему это может происходить?

Спасибо,
Тея.

Ответы [ 2 ]

2 голосов
/ 06 октября 2011

Нашел ответ, как только набрал этот пост.Каким-то образом удаление кнопки «Отмена» приводит к срабатыванию обеих кнопок.Странно.

РЕДАКТИРОВАТЬ: Хотя это действительно раздражает, потому что все мои индексы кнопок меняются между версиями iPhone и iPad (iPhone все еще нуждается в кнопке отмены).Как мне справиться с этим?

0 голосов
/ 13 ноября 2013

Я думаю, что iOS делает то, что она ожидает, что последняя кнопка будет кнопкой отмены (независимо от того, является ли она или нет), и удаляет ее, но, возможно, только для iPad. Возможно, это связано с тем, что пользователь может нажать за пределами листа действий, чтобы отклонить его. Проблема, с которой я столкнулся при выборе дизайна Apple, заключается в том, что не всегда очевидно, что диалог может или должен быть отклонен таким образом.

Например, я показываю свой лист действий, вызывая [actionSheet showInView:self.view]; Это приводит к тому, что весь вид отображается серым, а лист действий отображается в середине устройства. Пользователи собираются - по моему мнению, правильно - предположить, что им нужно выбрать одну из кнопок.

Я понимаю, что существуют другие механизмы отображения листа действий - например, тот, который отображает его в виде пузырька, прикрепленного к элементу панели кнопок - где кнопка отмены явно избыточна. Было бы хорошо, если бы Apple позволила больше гибкости здесь. Для моего приложения мне, вероятно, придется добавить фиктивную кнопку в конец массива, который я передаю в мой пользовательский конструктор, зная, что iOS его спрячет. Если поведение изменится в будущем выпуске iOS ... ну, мне просто нужно будет заняться этим в то время.

В вашем случае я не рекомендую использовать конструктор, который принимает cancelButtonTitle и destructiveButtonTitle. Вместо этого создайте подкласс UIActionSheet и добавьте кнопки вручную, используя метод выше. Затем установите cancelButtonIndex и destructiveButtonIndex на требуемые индексы. Помните, что у вас нет для установки этих двух свойств; они по умолчанию -1 (без кнопки). Кроме того, не забывайте соблюдать HIG в отношении положения ваших кнопок.

Вот один из конструкторов моего подкласса (отредактированный для краткости), просто чтобы дать вам представление:

- (instancetype)initWithTitle:(NSString *)title
                 buttonTitles:(NSArray *)buttonTitles
            cancelButtonIndex:(NSInteger)cancelButtonIndex
       destructiveButtonIndex:(NSInteger)destructiveButtonIndex
{
    self = [super initWithTitle:title delegate:nil cancelButtonTitle:nil destructiveButtonTitle:nil otherButtonTitles:nil];

    if (self)
    {
        if (buttonTitles)
        {
            [buttonTitles enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop)
            {
                [self addButtonWithTitle:obj];
            }];
        }
        self.cancelButtonIndex = cancelButtonIndex;
        self.destructiveButtonIndex = destructiveButtonIndex;
        if (self.cancelButtonIndex > -1)
        {
            [self addButtonWithTitle:@""];
        }
    }

    return self;
}
...