Подтвердить что ты не робот

Кнопка UIActionSheetIndex ошибочна при использовании более 6 пользовательских кнопок?

Я обнаружил странную проблему при использовании UIActionSheet на iPhone (iOS 4.2). Рассмотрим этот код:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {    

    [self.window addSubview:viewController.view];
    [self.window makeKeyAndVisible];

    UIActionSheet *actionSheet = [[UIActionSheet alloc] 
                                  initWithTitle:@"TestSheet" 
                                  delegate:self 
                                  cancelButtonTitle:@"Cancel" 
                                  destructiveButtonTitle:nil 
                                  otherButtonTitles: nil];

    [actionSheet addButtonWithTitle:@"one"];
    [actionSheet addButtonWithTitle:@"two"];
    [actionSheet addButtonWithTitle:@"three"];
    [actionSheet addButtonWithTitle:@"four"];
    [actionSheet addButtonWithTitle:@"five"];
    [actionSheet addButtonWithTitle:@"six"];
    //uncomment next line to see the problem in action
    //[actionSheet addButtonWithTitle:@"seven"];

    [actionSheet showInView:window];
    [actionSheet release];

    return YES;
}
- (void) actionSheet:(UIActionSheet *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex {
    NSLog(@"buttonIndex: %d, cancelButtonIndex: %d, firstOtherButtonIndex: %d",
          buttonIndex, 
          actionSheet.cancelButtonIndex, 
          actionSheet.firstOtherButtonIndex);
}

Если вы запустите это приложение, рабочий лист ведет себя так, как ожидалось. Это означает, что cancelButtonIndex всегда равен 0, и индексы кнопок сообщаются правильно. 1 для кнопки "один" и т.д. Если вы прокомментируете строку для добавления седьмой кнопки, таблица действий создаст вид таблицы, с кнопкой отмены на дополнительной строке. Если я нажму кнопку "один" в этом случае, переменная buttonindex будет равна 0, но так же будет cancelButtonIndex. Невозможно определить, нажал ли пользователь кнопку "отменить" или "один" . Это не похоже, что так должно быть. Кто-нибудь не согласен? Благодарим за помощь.

4b9b3361

Ответ 1

Я столкнулся с тем же вопросом, хотя я уже включил кнопку "Отмена" в качестве последней в листе действий и соответствующим образом установил свой индекс. Мои проблемы связаны с кнопкой "Деструктивная" . После некоторого расследования, вот мое решение проблемы:

  • После добавления кнопок N в таблицу действий он переключит свой макет, чтобы поместить кнопку "Разрушитель" вверху и кнопку "Отмена" внизу. В промежутке находится прокручиваемое представление, которое включает в себя все остальные кнопки. Другие источники указывают, что это табличный вид.

  • N - 7 для книжной ориентации и 5 для ландшафтной ориентации. N - 9 для портретной ориентации на более крупном 4-дюймовом экране. Эти цифры предназначены для всех кнопок, включая "Отмена" и "Разрушение". Чтобы быть ясным, N является наибольшим количеством кнопок перед коммутатором. Кнопки N + 1 приводят к тому, что UIActionSheet переключается на прокручиваемый вид.

  • Не имеет значения, где в листе действий вы первоначально положили кнопки "Отмена" и "Разрушение" в листе действий. Как только предел достигнут, кнопка "Разрушитель" перемещается в верхнюю часть, а "Отмена" перемещается в нижнюю часть.

  • Проблема заключается в том, что индексы не корректируются соответствующим образом. Итак, если вы изначально не добавляли "Отмена" в качестве последней кнопки, а "Деструктивная" в качестве первого, неверный индекс будет указан в файле "Действия": clickedButtonAtIndex: как указано в первоначальном отчете.

  • Итак, если у вас будет больше кнопок N в вашем листе действий, вы ДОЛЖНЫ добавить кнопку "Деструктивная" в таблицу действий в качестве первой кнопки в листе действий. Вы ДОЛЖНЫ добавить кнопку "Отмена" в качестве последней кнопки, добавленной в лист действий. Когда изначально построение листа просто оставляют как ноль, как описано в другом ответе.

Ответ 2

У меня была эта проблема. Решите его, не устанавливая первоначально кнопку отмены. Я индивидуально настраивал кнопки следующим образом:

   for(int index = 0; index < buttonTotal; index++)
   {
    [actionSheet addButtonWithTitle:[NSString stringWithFormat:buttonText, [buttonItems objectAtIndex: index]]];
   }

   [actionSheet addButtonWithTitle:@"Cancel"];
   actionSheet.cancelButtonIndex = actionSheet.numberOfButtons;

Я считаю, что нулевой индекс используется destructiveButton, если вы его используете, чтобы другие кнопки увеличивались оттуда, иначе они начнутся с 0.

Не уверен, что я согласен с опцией таблицы, так как выше определенной суммы, по умолчанию кнопки по прокручиваемому списку.

Ответ 3

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

Теперь вы можете настроить свои кнопки статически в init

UIActionSheet *actionSheet = [[UIActionSheet alloc] 
                              initWithTitle:@"TestSheet" 
                              delegate:self 
                              cancelButtonTitle:@"Cancel" 
                              destructiveButtonTitle:nil 
                              otherButtonTitles: @"one", @"two", @"three", @"four", @"five", @"six", @"seven", nil];

работает без проблем.

Ответ 4

1) Создайте экземпляр actionview с помощью

[[UIActionSheet alloc] InitWithTitle: Делегат: cancelButtonTitle: destructiveButtonTitle: OtherButtonTitles:]

без кнопки отмены или деструктивной кнопки (установите их на нуль)

2) Добавьте все кнопки как обычно, используя [myActionSheet addButtonWithTitle:(NSString *)].

3) Если вам нужна специальная кнопка, добавьте ее, используя тот же метод, что и шаг 2, и установите заголовок на все (@"Cancel", например);

4) Теперь установите свойство [myActionSheet setCancelButtonIndex:] в индекс последней кнопки на листе действий, который был выполнен кнопкой отмены. Сделайте то же самое для деструктивной кнопки. (По умолчанию они равны -1, из-за чего они не отображаются)

  • Обратите внимание, что кнопка разрушения всегда будет отображаться сверху, а кнопка отмены всегда будет отображаться внизу, что не может быть изменено.

  • Кроме того, вы можете добавить кнопку отмены/разрушения в индекс 0 и добавить после этого все остальные кнопки. Однако теперь первый индекс ваших других кнопок равен 1, а не нулю. Это может сбивать с толку, если у вас есть массив, соответствующий кнопкам alertview.

Ответ 5

Сделайте, как показано ниже:

UIActionSheet *actionSheet = [[UIActionSheet alloc] 
                              initWithTitle:@"TestSheet" 
                              delegate:self 
                              cancelButtonTitle:@"Cancel" 
                              destructiveButtonTitle:@"Delete" 
                              otherButtonTitles: @"one", @"two", @"three", @"four", @"five", @"six", @"seven", @"eight", nil];

Это означает, что деструктивная кнопка определяет как destructiveButtonTitle. ИЗБЕГАЙТЕ с помощью кнопки деструктивного/отмена в otherButtonTitles.