Используйте NSArray, чтобы указать другие названия кнопок?
конструктор UIAlertSheet принимает параметр otherButtonTitles в качестве списка varg. Вместо этого я хотел бы указать другие названия кнопок из NSArray. Это возможно?
т. е. я должен сделать так:
id alert = [[UIActionSheet alloc] initWithTitle: titleString
delegate: self
cancelButtonTitle: cancelString
destructiveButtonTitle: nil
otherButtonTitles: button1Title, button2Title, nil];
но так как я формирует список доступных кнопок во время выполнения, я хочу что-то вроде этого:
id alert = [[UIActionSheet alloc] initWithTitle: titleString
delegate: self
cancelButtonTitle: cancelString
destructiveButtonTitle: nil
otherButtonTitles: otherButtonTitles];
сейчас, я думаю, что мне нужно иметь отдельный вызов initWithTitle:
для 1 пункта, 2 пунктов и 3 пунктов. Как это:
if ( [titles count] == 1 ) {
alert = [[UIActionSheet alloc] initWithTitle: titleString
delegate: self
cancelButtonTitle: cancelString
destructiveButtonTitle: nil
otherButtonTitles: [titles objectAtIndex: 0], nil];
} else if ( [titles count] == 2) {
alert = [[UIActionSheet alloc] initWithTitle: titleString
delegate: self
cancelButtonTitle: cancelString
destructiveButtonTitle: nil
otherButtonTitles: [titles objectAtIndex: 0], [titles objectAtIndex: 1], nil];
} else {
// and so on
}
это много дубликатов кода, но это может быть разумно, так как у меня есть не более трех кнопок. Как я могу этого избежать?
6 ответов:
это год, но решение довольно простое ... сделайте, как предложил @Simon, но не указывайте название кнопки отмены, поэтому:
UIActionSheet *alert = [[UIActionSheet alloc] initWithTitle: titleString delegate: self cancelButtonTitle: nil destructiveButtonTitle: nil otherButtonTitles: nil];
но после добавления обычных кнопок, добавьте кнопку отмены, например:
for( NSString *title in titles) { [alert addButtonWithTitle:title]; } [alert addButtonWithTitle:cancelString];
теперь ключевой шаг-указать, какая кнопка является кнопкой отмены, например:
alert.cancelButtonIndex = [titles count];
мы
[titles count]
, а не[titles count] - 1
потому что мы добавляем кнопку отмены как дополнительную из списка кнопок вtitles
.вы теперь также укажите, какую кнопку вы хотите быть деструктивной кнопкой (т. е. красной кнопкой), указав destructiveButtonIndex (обычно это будет ). Кроме того, если вы удерживаете кнопку "Отмена", чтобы быть последней кнопки, iOS будет добавить, что приятно, расстояние меж других кнопок и кнопки "Отмена".
все это совместимо с iOS 2.0, так что наслаждайтесь.
вместо добавления кнопок при инициализации UIActionSheet, попробуйте добавить их с помощью метода addButtonWithTitle, используя цикл for, который проходит через ваш NSArray.
UIActionSheet *alert = [[UIActionSheet alloc] initWithTitle: titleString delegate: self cancelButtonTitle: cancelString destructiveButtonTitle: nil otherButtonTitles: nil]; for( NSString *title in titles) [alert addButtonWithTitle:title];
addButtonWithTitle: возвращает индекс добавленной кнопки. Установите cancelButtonTitle в nil в методе init и после добавления дополнительных кнопок выполните следующее:
actionSheet.cancelButtonIndex = [actionSheet addButtonWithTitle:@"Cancel"];
- (void)showActionSheetWithButtons:(NSArray *)buttons withTitle:(NSString *)title { UIActionSheet *actionSheet = [[UIActionSheet alloc] initWithTitle: title delegate: self cancelButtonTitle: nil destructiveButtonTitle: nil otherButtonTitles: nil]; for (NSString *title in buttons) { [actionSheet addButtonWithTitle: title]; } [actionSheet addButtonWithTitle: @"Cancel"]; [actionSheet setCancelButtonIndex: [buttons count]]; [actionSheet showInView:self.view]; }
вы можете добавить кнопку отмены и установить ее следующим образом:
[actionSheet setCancelButtonIndex: [actionSheet addButtonWithTitle: @"Cancel"]];
Я знаю, что это старый пост, но в случае, если кто-то еще, как я, пытается выяснить это.
(на это ответил @kokemomuke. Это в основном более подробное объяснение. Также опираясь на @Ephraim и @Simon)
получается последние запись addButtonWithTitle: должен быть . Я бы использовал:
// All titles EXCLUDING Cancel button for( NSString *title in titles) [sheet addButtonWithTitle:title]; // The next two line MUST be set correctly: // 1. Cancel button must be added as the last entry // 2. Index of the Cancel button must be set to the last entry [sheet addButtonWithTitle:@"Cancel"]; sheet.cancelButtonIndex = titles.count - 1;