несколько параметров в @selector в Objective-C - PullRequest
2 голосов
/ 10 августа 2010

Если это имя метода, которое должно быть вызвано:

-(Authenticate_Obj)Authenticate_User:(NSString*)Number:(NSString*)name:(NSString*)password

как вызвать этот метод из @selector ??

Могу ли я сделать это таким образом ??

[tis_obj AuthenticateMobileServer:self action:@selector(AuthenticateUser:::)];

Спасибо.

Ответы [ 5 ]

8 голосов
/ 10 августа 2010

Учитывая это:

-(Authenticate_Obj)Authenticate_User:(NSString*)Number:(NSString*)name:(NSString*)password

Селектор вашего метода:

Authenticate_User:::

Какую строку вы бы передали @selector().

Ваш AuthenticateMobileServer:action: метод должен принимать селектор, который при вызове принимает этот набор аргументов, очевидно.

Однако у этого кода есть несколько проблем (первая подсказка - два неправильных ответа от очень хорошо осведомленных людей).

  1. Имена методов не начинаются с заглавных букв и не содержат _ s.Имена методов в верблюжьей клетке.Итак, что-то вроде authenticateUserNumber:name:password: будет более подходящим именем метода.

  2. Каждый аргумент должен иметь часть имени метода, которая его описывает.Опять же, authenticateUserNumber:name:password: будет соответствовать стандартной практике.

  3. Имена классов не содержат _.Я предполагаю, что Authenticate_Obj - это класс.Если это так, он также должен быть возвращен в качестве указателя.

А именно, этот метод, вероятно, должен выглядеть примерно так:

- (AuthenticateObject *) authenticateUserNumber: (NSString*) aNum
                                           name: (NSString *) aName
                                       password: (NSString *) aPassword;
3 голосов
/ 10 августа 2010

Как указал Крис, правильный синтаксис для объявления селектора для метода с несколькими параметрами:

@selector(Authenticate_User:Number:name:) 

Однако вы не можете вызвать метод, который принимает более 1 параметра, используя метод -performSelector (и тому подобное) - для этого вам нужно использовать NSInvocation класс

2 голосов
/ 10 августа 2010

Вы можете сделать это так: @selector(Authenticate_User:Number:name:)

0 голосов
/ 21 октября 2012

Вы можете сделать это, используя NSInvocation:

SEL selector = @selector(Authenticate_User:Number:name:);
NSMethodSignature * ms = [self methodSignatureForSelector:selector];
NSInvocation *inv = [NSInvocation invocationWithMethodSignature:ms];
[inv setTarget:self];
[inv setSelector:selector];
[inv setArgument:&param1 atIndex:2];
[inv setArgument:&param2 atIndex:3];
[inv setArgument:&param3 atIndex:3];
[inv invoke];
Authenticate_Obj * returnObject = nil;
[inv getReturnValue:&returnObject];

Я предлагаю вам проверить github-репозиторий Эрики Садун под названием NSObject-Utilities , чтобы проверить больше примеров кода с NSInvocation.

0 голосов
/ 11 мая 2012

Отправьте NSMutableDictionary или NSMutableArray, который содержит всю необходимую информацию в качестве параметра.

...