Передать список переменных аргументов - PullRequest
1 голос
/ 25 сентября 2011

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

#import <UIKit/UIKit.h>

// Public Interface
typedef void (^FJActionSheetCompletion)(int buttonIndex);

@interface FJActionSheet : UIActionSheet

- (id)initWithTitle:(NSString *)title 
    completionBlock:(FJActionSheetCompletion)completionBlock
  cancelButtonTitle:(NSString *)cancelButtonTitle 
destructiveButtonTitle:(NSString *)destructiveButtonTitle 
  otherButtonTitles:(NSString *)otherButtonTitles, ... NS_REQUIRES_NIL_TERMINATION;

@end

// Private Interface
@interface FJActionSheet() <UIActionSheetDelegate>
{
    FJActionSheetCompletion _completionBlock;
}
@end

// Implementation
@implementation FJActionSheet

- (id)initWithTitle:(NSString *)title 
    completionBlock:(FJActionSheetCompletion)completionBlock
  cancelButtonTitle:(NSString *)cancelButtonTitle 
destructiveButtonTitle:(NSString *)destructiveButtonTitle 
  otherButtonTitles:(NSString *)otherButtonTitles, ...
{
    self = [super initWithTitle:title
                       delegate:self
              cancelButtonTitle:cancelButtonTitle
         destructiveButtonTitle:destructiveButtonTitle
              otherButtonTitles:otherButtonTitles];

    if (self)
    {
        _completionBlock = [completionBlock copy];
    }

    return self;
}

- (void)actionSheet:(UIActionSheet *)actionSheet didDismissWithButtonIndex:(NSInteger)buttonIndex
{
    _completionBlock(buttonIndex);
}

@end

Это работает, за исключением одной проблемы: я не могу передать несколько строк для otherButtonTitles. Если я делаю это, как указано выше, я (очевидно) получаю «Отсутствует стража в методе отправки».

Мой вопрос: как я могу передать аргумент otherButtonTitles инициализатору UIActionSheet?

1 Ответ

1 голос
/ 25 сентября 2011

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

va_list args;
va_start(args, firstArg);
va_arg(args, NSString*)
...