Подтвердить что ты не робот

IPhone SDK - UIActionSheet - Динамические названия кнопок

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

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

4b9b3361

Ответ 1

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

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;

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

Ответ 2

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

Ответ 3

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

// 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];

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

Ответ 4

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

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

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