2014-09-29 5 views
3

Я пытаюсь настроить очень простой UIAlertView с текстовым редактированием, кнопкой «ОК» и «Отмена», и я хочу отключить кнопку «ОК» на основе содержимого редактирования текста.Переменные переменные аргументы для UIAlertView

Чтобы удержать делегата, чтобы он не ушел перед представлением оповещения (и, таким образом, вызвал сбой, как только пользователь что-то сделал с видом предупреждения), я подклассифицировал его. Теперь я хочу, чтобы иметь возможность направить otherButtonTitles аргумент из моего метода инициализации методы UIAlertView инициализации, но по некоторым причинам, просто делать это:

- (id)initWithTitle:(NSString *)title 
      message:(NSString*)message 
      delegate:(id /*<UIAlertViewDelegate>*/)delegate 
    cancelButtonTitle:(NSString *)cancelButtonTitle 
    otherButtonTitles:(NSString *)otherButtonTitles, ... { 

    if (self = [super initWithTitle:title 
          message:message 
          delegate:delegate 
        cancelButtonTitle:cancelButtonTitle 
        otherButtonTitles:otherButtonTitles, nil]) { 
     //stuff 
    } 

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

va_list args; 
va_start(args, otherButtonTitles); 
for (NSString *buttonTitle = otherButtonTitles; buttonTitle != nil; buttonTitle = va_arg(args, NSString*)) { 
    [self addButtonWithTitle:buttonTitle]; 
} 
va_end(args); 

, но затем, мой alertViewShouldEnableFirstOtherButton метод делегата не вызывается больше, with the probable explanation in this post.

Таким образом, как правильно перевести мой otherButtonTitles в метод инициализации UIAlertView?

+0

Я всегда был обеспокоен тем фактом, что в C вы можете собирать с переменным числом аргументов va_list, но не имеет возможностей передавать их дальше к другому VARIADIC функции. Мы знаем как аби, так и границы, но не сэр. – user3125367

+0

Btw, если вы знакомы с objc runtime (objc_msgSend) и уверены, что количество других кнопок никогда не превышает фиксированного предела, вы можете использовать хак, описанный здесь: http://c-faq.com/varargs/handoff.html – user3125367

+0

@ user3125367 Спасибо за ссылку, но здесь это совершенно невозможно, так как я связан сигнатурой метода инициализации 'UIAlertView', которая не принимает переменные va_list, но вариативные аргументы ... – JBL

ответ

0

Сведут нажатие клавиш, то:

NSMutableArray *otherButtonTitles = [NSMutableArray array]; 
// .. collect varargs into ^^^ 

#define T(n) ([otherButtonTitles objectAtIndex:n]) 
#define CASE(n, ...) case n: self = [super initWithTitle:title \ 
               message:message \ 
               delegate:delegate \ 
             cancelButtonTitle:cancelButtonTitle \ 
             otherButtonTitles:__VA_ARGS__, nil]; \ 
          break 

switch ([otherButtonTitles count]) { 
    CASE(0, nil); 
    CASE(1, T(0)); 
    CASE(2, T(0), T(1)); 
    CASE(3, T(0), T(1), T(2)); 
    // ... repeat until bored ... 
    default: @throw @"too many buttons"; // or return nil 
} 
Смежные вопросы