UIActionSheet в альбомной ориентации имеет неправильную кнопку

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

Я пробовал создать actionSheet с помощью initWithTitle: delegate: 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 отображается следующим образом;

лист действий

Мой представитель отвечает так;

- (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

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

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

Может ли кто-нибудь увидеть, где я ошибся?

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


person Roger    schedule 21.04.2011    source источник


Ответы (4)


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

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

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

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

person Roger    schedule 21.04.2011
comment
Просто чтобы добавить одно пояснение: чтобы использовать этот метод, вам нужно передать nil в качестве заголовка кнопки отмены в initWithTitle: delegate: cancelButtonTitle: destructiveButtonTitle: otherButtonTitles: метод. Затем вы можете добавить кнопку отмены последней, как описано в этом ответе. - person kalperin; 15.03.2012
comment
Просто столкнулся с той же проблемой. Сообщил об ошибке: rdar: // 11361874 или openradar.me/11361874 - person Nikolai Ruhe; 02.05.2012

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

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

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

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

Проблема в том, что индексы не корректируются соответствующим образом. Таким образом, если вы изначально не добавляли кнопку «Отмена» в качестве последней кнопки, а кнопку «Разрушающий» - в качестве первой, в actionSheet: clickedButtonAtIndex: будет указан неверный индекс, как указано в первоначальном отчете.

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

person Rich Waters    schedule 31.05.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, потому что панель вкладок перехватывает события касания и предотвращает нажатие нижней кнопки.

person Brainware    schedule 04.11.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, даже если есть режим прокрутки.

person Cal    schedule 06.12.2011