Я думаю, что 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;
}