iPhone SDK - UIActionSheet - названия динамических кнопок - PullRequest
21 голосов
/ 26 октября 2009

У меня есть требование в приложении, где мне нужно иметь возможность динамически добавлять другиеButtonTitles в зависимости от некоторых BOOL-переключателей, которые пользователь указал в настройках. Тем не менее, я не могу понять, как это сделать при инициализации UIActionSheet. Я попытался передать массив NSString (NSString [2]), а также NSArray без какой-либо удачи.

Любая помощь здесь очень ценится.

Ответы [ 4 ]

58 голосов
/ 25 октября 2010

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

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

Затем добавьте загрузку кнопок по мере необходимости:

if(buttonX)
{
    [actionSheet addButtonWithTitle:@"Button X"];
}
if(buttonY)
{
    [actionSheet addButtonWithTitle:@"Button Y"];
}
if(buttonZ)
{
    [actionSheet addButtonWithTitle:@"Button Z"];
}

Затем, наконец, добавьте кнопку отмены в конце и установите индекс кнопки отмены:

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

Конечно, вы можете добавить и кнопку отмены, и / или деструктивную кнопку таким образом.

6 голосов
/ 26 октября 2009

Вы можете добавить новые кнопки в (уже инициализированный) UIActionSheet с помощью метода addButtonWithTitle:. Вы также можете создавать свои пользовательские кнопки UIB и добавлять их в представление UIActionSheet как подпункты

2 голосов
/ 27 октября 2009

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

// button titles    
NSMutableArray *buttons = [[NSMutableArray alloc] init];
[buttons addObject:@"Button 1"];
[buttons addObject:@"Button 2"];

// placeholders
NSString *button0 = nil, *button1 = nil, *button2 = nil;

// put together the buttons
for (int x = 0; x < buttons.count; x++) {
    switch (x) {
        case 0:
            button0 = [buttons objectAtIndex:x];
            break;
        case 1:
            button1 = [buttons objectAtIndex:x];
            break;
        case 2:
            button2 = [buttons objectAtIndex:x];
            break;
    }
}

// action sheet
UIActionSheet *option = [[UIActionSheet alloc] initWithTitle:nil delegate:self cancelButtonTitle:@"Cancel" destructiveButtonTitle:nil otherButtonTitles:button0, button1, button2, nil];

Надеюсь, что это полезно для других, сталкивающихся с подобной дилеммой.

1 голос
/ 27 октября 2009

Если вам нужно столько кнопок, создайте свой собственный модальный вид и собственный протокол делегата.

Проверьте документацию для presentModalViewController:animated и dismissModalViewController:animated:

Когда пользователь отклоняет ваше модальное представление, ваш делегат может получить созданный вами метод, например, customActionSheetDidFinish:(int)buttonChosen

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...