UIActionSheet addButtonWithTitle: не добавляет кнопки в правильном порядке - PullRequest
9 голосов
/ 11 августа 2009

Я вложил в подкласс UIActionSheet, и в методе -init я должен добавить кнопки по отдельности после вызова супер init (не может передать var_args).

Прямо сейчас это выглядит так:

if (self = [super initWithTitle:title delegate:self cancelButtonTitle:cancel destructiveButtonTile:destroy otherButtonTitles:firstButton,nil]) {
  if (firstButton) {
    id buttonTitle;
    va_list argList;
    va_start(argList, firstButtton);
    while (buttonTitle = va_arg(argList, id)) {
      [self addButtonWithTitle:buttonTitle]
    }
    va_end(argList);
  }
}
return self;

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

Button1
Отмена
Button2
Button3

Как будто их просто добавили в конец списка, что имеет смысл; однако, я не хочу, чтобы это выглядело так; так что мне делать? Есть ли вообще какой-то способ правильно создать подкласс UIActionSheet и заставить его работать?

Ответы [ 3 ]

21 голосов
/ 11 августа 2009

Вы можете просто добавить их в правильном порядке, а затем вручную установить cancelButtonIndex и destructiveButtonIndex.

Для вашего примера кода:

if (self = [super initWithTitle:title delegate:self cancelButtonTitle:nil destructiveButtonTile:nil otherButtonTitles:nil]) {
  if (firstButton) {
    id buttonTitle;
    int idx = 0;
    va_list argList;
    va_start(argList, firstButtton);
    while (buttonTitle = va_arg(argList, id)) {
      [self addButtonWithTitle:buttonTitle]
      idx++;
    }
    va_end(argList);
    [self addButtonWithTitle:cancel];
    [self addButtonWithTitle:destroy];
    self.cancelButtonIndex = idx++;
    self.destructiveButtonIndex = idx++;
  }
}
return self;
8 голосов
/ 21 июля 2010

Aviad Ben Dov отвечает правильно, однако счетчик индекса кнопки не нужен для установки индекса для индексов уничтожения и отмены. AddButtonWithTitle: метод возвращает индекс недавно использованной кнопки, поэтому мы можем сразу использовать это значение следующим образом:

    if (self = [super initWithTitle:title delegate:self cancelButtonTitle:nil destructiveButtonTile:nil otherButtonTitles:nil]) {
  if (firstButton) {
    id buttonTitle;
    va_list argList;
    va_start(argList, firstButtton);
    while (buttonTitle = va_arg(argList, id)) {
      [self addButtonWithTitle:buttonTitle]
    }
    va_end(argList);
    self.cancelButtonIndex = [self addButtonWithTitle:cancel];
    self.destructiveButtonIndex = [self addButtonWithTitle:destroy];
  }
}
return self;
3 голосов
/ 25 июня 2012

Более ранние ответы приводят к тому, что деструктивная кнопка помещается внизу, что не соответствует HIG, и это также очень сбивает с толку пользователя. Деструктивная кнопка должна быть вверху, кнопка отмены внизу, а остальные - посередине.

Правильно упорядочены следующие пункты:

sheetView         = [[UIActionSheet alloc] initWithTitle:title delegate:self
                                       cancelButtonTitle:nil destructiveButtonTitle:destructiveTitle otherButtonTitles:firstOtherTitle, nil];
if (otherTitlesList) {
    for (NSString *otherTitle; (otherTitle = va_arg(otherTitlesList, id));)
        [sheetView addButtonWithTitle:otherTitle];
    va_end(otherTitlesList);
}
if (cancelTitle)
    sheetView.cancelButtonIndex      = [sheetView addButtonWithTitle:cancelTitle];

См. https://github.com/Lyndir/Pearl/blob/master/Pearl-UIKit/PearlSheet.m для реализации (оболочка UIActionSheet с API на основе блоков).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...