Objective-C中@selector中的多个参数

时间:2010-08-10 09:17:52

标签: objective-c selector

如果这是必须调用的方法名称:

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

如何从@selector ??

调用此方法

我可以这样做吗?

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

谢谢。

5 个答案:

答案 0 :(得分:8)

鉴于此:

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

您方法的选择器是:

Authenticate_User:::

您要传递给@selector()的字符串。

你的AuthenticateMobileServer:action:方法必须采用一个选择器,当被调用时,显然会采用这组参数。

然而,这段代码存在一些问题(第一个线索是其他非常知识渊博的人的两个错误答案)。

  1. 方法名称不以大写字母开头,也不包含_个。方法名称是驼峰式的。因此,像authenticateUserNumber:name:password:这样的方法名称会更合适。

  2. 每个参数都应该包含描述它的方法名称的一部分。同样,authenticateUserNumber:name:password:符合标准做法。

  3. 班级名称中没有_。我假设Authenticate_Obj是一个类。如果是这样,它也需要作为指针返回。

  4. 即,该方法应该类似于:

    - (AuthenticateObject *) authenticateUserNumber: (NSString*) aNum
                                               name: (NSString *) aName
                                           password: (NSString *) aPassword;
    

答案 1 :(得分:3)

正如Chris指出的那样,正确的语法为具有多个参数的方法声明选择器

@selector(Authenticate_User:Number:name:) 

但是你不能使用-performSelector方法(和类似方法)调用一个多于1个参数的方法 - 你必须使用NSInvocation

答案 2 :(得分:2)

你可以这样做:@selector(Authenticate_User:Number:name:)

答案 3 :(得分:0)

发送NSMutableDictionaryNSMutableArray,其中包含所有必需的信息作为参数。

答案 4 :(得分:0)

您可以使用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];

我建议您查看名为NSObject-Utilities的Erica Sadun的github存储库,以查看NSInvocation的更多代码示例。