在 objective-c 中是否有类似的 JavaScript 应用方法
Is there JavaScript apply like method in objective-c?
所以基本上我正在使用window.location="myobj:mymethod:myarg:myotherarg"实现在objc中处理JavaScript调用的典型方法,但是,我想知道是否有一种方法可以将参数数组应用于方法,类似于在JavaScript中的方式。
通常我一直在做
-(void) mymethod:(NSArray*) arr{
//method knows how many arguments it takes and what they mean at each index
}
我宁愿做:
-(void) mymethod:(NSString*) myarg myOtherArg: (NSString*) myotherarg{
//do stuff
}
并有这样的方法:
+(void) callMethod:(NSString*)selectorName withArgs: (NSArray*)args onObject:(id) obj{
//implementation
}
[JEHelpers callMethod:selector withArgs:someArrayOfArgs onObject:myapp]
这可能吗?
如果您知道没有方法会接受两个以上的参数,则可以使用 performSelector:withObject:withObject:
来执行这些调用。如果该方法采用的参数少于两个,则将忽略未使用的withObject:
字段。
+ (id)callMethod:(NSString *)selectorName withArgs:(NSArray *)args onObject:(id)obj {
id arg1 = nil, arg2 = nil;
if([args count]) {
arg1 = [args objectAtIndex:0];
if([args count] > 1])
arg2 = [args objectAtIndex:1];
}
return [obj performSelector:NSSelectorFromString(selectorName)
withObject:arg1 withObject:arg2];
}
如果可能有两个以上的参数,则必须使用 NSInvocation
。此类允许您通过传递各种参数并定义选择器和对象来构造消息,然后发送消息并获取结果。
+ (id)callMethod:(NSString *)selectorName withArgs:(NSArray *)args onObject:(id)obj {
SEL sel = NSSelectorFromString(selectorName);
NSMethodSignature *signature = [obj methodSignatureForSelector:sel];
NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:signature];
[invocation setSelector:sel];
[invocation setTarget:obj];
NSUInteger index = 2;
for(id arg in args) {
[invocation setArgument:&arg atIndex:index];
++index;
}
id result;
[invocation setReturnValue:&result];
[invocation invoke];
return result;
}
我不确定我是否完全理解这个问题(我不太了解JavaScript)。但是,您可以使用 NSInvocation 向任何对象发送任意消息。像这样:
+(void) callMethod:(NSString*)selectorName withArgs: (NSArray*)args onObject:(id) obj
{
SEL selector = NSSelectorFromString(selectorName);
if (![obj respondsToSelector:selector]) {
// Object doesn't respond to selector, so do something else/handle the error
}
NSMethodSignature *methodSignature = [obj methodSignatureForSelector:selector];
NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:methodSignature];
[invocation setTarget:obj];
[invocation setSelector:selector];
for (NSUInteger i=0; i<[args count]; i++) {
id argument = [args objectAtIndex:i];
[invocation setArgument:&argument atIndex:i+2]; // Arg 0 is self, arg 1 is _cmd
}
id result;
[invocation setReturnValue:&result];
[invocation invoke];
}
您可能想要查看 NSInvocation。具体来说,您希望使用选择器名称的方法签名(NSObject -methodSignatureForSelector:)构建 NSInvocation,然后设置选择器、目标和参数。请记住:您应该检查参数类型(NSMethodSignature -getArgumentTypeAtIndex:,是否等于"@"),并且您传递的参数从 2 开始索引(因为 0 和 1 是对象的自身和方法选择器)。
顺便说一句,我并不是说这是一个好主意;在极少数情况下,这种方法是有道理的。
这有点笨拙,但有可能:
- (id)method:(NSString *)arg1, ... {
va_list args;
va_start(args, arg1);
for (NSString *a = arg1; a!= nil; a= va_arg(args, NSString*)) {
// do stuff
}
}
传统上arg1
是一个字符串,用于定义数据类型和额外参数的数量。
你可以这样称呼它:
[self method:@"5", @"4", @"3", @"2", @"1"];
对于大多数目的,您的数组方法可能更清晰。
- 如何将HTML id分配给元素,以及如何将JavaScript应用于元素
- 如果文本字段为空,则使用JavaScript应用CSS样式
- MockJax没有在JavaScript应用程序中发送对我AJAX请求的响应
- 如何远程检查JavaScript应用程序的函数调用堆栈
- Windows 8 Javascript应用程序XML对象
- 将javascript应用程序迁移到使用AMD的提示(例如requirejs)
- 如何使用原型继承编写一个整洁灵活的复杂javascript应用程序
- 我如何知道js文件之间的javascript应用程序代码流
- PHP文件没有't从Javascript应用程序获取$_POST
- 在Windows Metro风格的Javascript应用程序中读取文件内容
- 在前端javascript应用程序中使用DI容器有意义吗
- 仅将JavaScript应用于部分代码(例如菜单)
- 将一个主要网站转换为javascript应用程序
- 使用javascript应用视差效果时,图像会发生抖动
- 应该如何将密码从纯html/javascript应用程序发送到php页面
- JavaScript应用CSS3渐变
- 集成多个JavaScript应用程序
- 如何将 Javascript 应用于分组的 SharePoint 列表
- Windows 8 HTML5 JavaScript 应用程序中向左滑动的事件名称是什么
- 用于组织大型javascript应用程序的工具和最佳实践