Кнопка 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. Невозможно определить, нажал ли пользователь кнопку "отменить" или "один" . Это не похоже, что так должно быть. Кто-нибудь не согласен? Благодарим за помощь.
Ответы
Ответ 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
.