UIActionSheet в альбоме имеет неверную кнопкуIndicies - PullRequest
3 голосов
/ 21 апреля 2011

У меня есть лист действий, который вызывает у меня горе на iphone в альбомной ориентации. Все отображается просто отлично, но в альбомной ориентации первая реальная кнопка имеет тот же индекс, что и кнопка отмены, и поэтому логика не работает.

Я пытался создать actionSheet с помощью initWithTitle: делегат: cancelButtonTitle: destructiveButtonTitle: otherButtonTitles: но это было то же самое, мой текущий код выглядит следующим образом;

UIActionSheet* actionMenu = [[UIActionSheet alloc] init];

actionMenu.delegate = self;
actionMenu.title = folderentry.Name;
actionMenu.cancelButtonIndex = 0;

[actionMenu addButtonWithTitle:NSLocalizedString(@"str.menu.cancel",nil)];

[self addActiveButtons:actionMenu forEntry:folderentry];
[actionMenu showInView:[self.navigationController view]];
[actionMenu release];

Метод addActiveButtons в основном настраивает, какие кнопки для добавления, какие он делает, используя код, подобный этому;

[menu addButtonWithTitle:NSLocalizedString(@"str.menu.sendbyemail",nil)];

Иногда может быть 6 кнопок, поэтому в альбомном режиме actionSheet отображается так:

action sheet

Мой делегат отвечает так:

- (void)actionSheet:(UIActionSheet *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex {

NSLog(@"Cancel Button Index is : %d",actionSheet.cancelButtonIndex);
NSLog(@"Button clicked was for index : %d",buttonIndex);

NSString *command = [actionSheet buttonTitleAtIndex:buttonIndex];

DLog(@"COMMAND IS: %@ for index: %d",command,buttonIndex);

if ([command isEqualToString:NSLocalizedString(@"str.menu.sendbyemail",nil)]) {

    // Do stuff here

}

if ( ... similar blocks ... ) { }

}

В показанном примере я обнаружил, что cancelButtonIndex равен 0, как и ожидалось, но так же, как индекс кнопки для первой другой кнопки! Это означает, что если я нажму на вторую (например, кнопку «Сохранить в фотографии») , мой вывод отладки будет выглядеть так:

Индекс кнопки отмены: 0

Нажатие кнопки было для индекса: 1

КОМАНДА IS: Отправить по электронной почте для индекса: 1

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

Кто-нибудь может увидеть, где я ошибся?

PS. Я знаю, что это не самый лучший опыт пользовательского интерфейса, но я полагаю, что большинство пользователей на самом деле будут в портретной ориентации большую часть времени или используют версию приложения для iPad, поэтому я готов принять поведение по умолчанию для таблицы действий при условии, что могу заставить его на самом деле работать!

Ответы [ 4 ]

4 голосов
/ 21 апреля 2011

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

int added = [self addActiveButtons:actionMenu forEntry:folderentry];

[actionMenu addButtonWithTitle:NSLocalizedString(@"str.menu.cancel",nil)];
actionMenu.cancelButtonIndex = added;

Надеюсь, что это поможет кому-то еще бороться ста же проблема!

3 голосов
/ 01 июня 2011

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

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

Для iPhone N равно 7 для книжной ориентации и 5 для альбомной ориентации.Эти цифры относятся ко всем кнопкам, включая «Отмена» и «Деструктивный».

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

Проблема заключается в том, что индексы не регулируются соответствующим образом.Итак, если вы изначально не добавили кнопку «Отмена» в качестве последней кнопки и «Деструктивную» в качестве первой, в actionSheet будет отображаться неверный индекс: clickedButtonAtIndex: как указано в первоначальном отчете.чтобы иметь больше чем N кнопок на вашем листе действий, вы ДОЛЖНЫ добавить кнопку Destructive в actionSheet в качестве первой кнопки на листе действий.Вы ДОЛЖНЫ добавить кнопку «Отмена» в качестве последней кнопки, добавленной на лист действий.При первоначальном построении листа просто оставьте оба как ноль, как описано в другом ответе.

0 голосов
/ 07 декабря 2011

Мое решение состоит в том, чтобы инициализировать как это, указав только destructiveButtonTitle ...

    UIActionSheet * as =[[[UIActionSheet alloc] initWithTitle:nil
                                                 delegate:self 
                                        cancelButtonTitle:nil 
                                   destructiveButtonTitle:@"Cancel" 
                                        otherButtonTitles:nil] autorelease];
[as addButtonWithTitle:@"Button 1"];
[as addButtonWithTitle:@"Button 2"];

Таким образом, вы всегда получаете кнопку «Отмена» с индексом 0, а ваши собственные кнопки начинаются с индекса 1 даже при наличии прокрутки.

0 голосов
/ 04 ноября 2011

У меня была такая же проблема. Чтобы это исправить, я просто создаю actionSheet с nil для всех кнопок, а затем добавляю кнопки вручную. Наконец, в обработчике игнорируйте firstOtherButtonIndex, потому что он будет неправильным (даже если вы установите его раньше времени). Вместо этого предположим, что это 1, потому что индекс 0 является кнопкой отмены в этом примере. Вот код:

NSArray *items = [NSArray arrayWithObjects:@"one", @"two", @"three", nil];
UIActionSheet* actionSheet = [[[UIActionSheet alloc] initWithTitle:@"Title" delegate:self cancelButtonTitle:nil destructiveButtonTitle:nil otherButtonTitles:nil] autorelease];
[actionSheet addButtonWithTitle:@"Cancel"];
for (NSString *title in items) {
    [actionSheet addButtonWithTitle:title];
}
[actionSheet addButtonWithTitle:@"Destroy"];

// set these if you like, but don't bother setting firstOtherButtonIndex.
actionSheet.cancelButtonIndex = 0;
actionSheet.destructiveButtonIndex = [items count]+1;

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

...