我正在编写一个Javascript类,它将带有一个参数的函数传递给Objective-C类(使用NimbleKit框架)。它是这样的:
NKRegisterClass("SKGetEvents");
// TEMP Test date sent to the NKitAction, won't be hardcoded
var testDate = "2011-10-14";
var goButton = new NKButton();
goButton.init(100,20,100,50,"callGetEvents(testDate)"); /*Button to launch function */
goButton.setTitle("Get Events");
goButton.show();
function callGetEvents(testDate) {
CallNKitAction("GetEventsFunction?className=SKGetEvents&dateStringInput="+testDate);
}
因此它将使用CallNKitAction调用已注册的Objective-C类函数,并传递一个
javascript字符串(在本例中为 var testDate =“2011-10-14”)作为参数。
Objective-C类中的响应函数根本不会被调用。它看起来像这样:
-(NSString *) GetEventsFunction:(const char *)dateStringInput {
// Do stuff with date passed }
如果我将函数更改为不带参数,只是在其中硬编码日期,则该函数称为正常并且有效。这告诉我问题是试图传递JS var作为(const char *)是问题所在。我不知道如何将其调用到函数中然后将其转换为NSString以供使用,到目前为止我已经尝试将字符串作为NSString传递,const char并使用StringWithUTF8String将其转换为NSString,都无济于事。
很抱歉有很长的解释,但有没有人对如何实现这一点有任何想法? (也曾在他们的论坛上问过,但也没有在这里发帖的非常大的社区。)帮助将不胜感激。
答案 0 :(得分:0)
如果其他人需要知道,我正在补充我如何解决这个非常古老的问题: NimbleKit允许通过存储在NSDictionary中的一些内置参数方法,将所需数量的参数从Javascript传递到Objective-C。它甚至允许一个简单的单行将结果返回给调用的Javascript函数!
Javascript方面很好(除非你想得到一个结果,下面有更多内容),但是对于目标Objective-C类,将以下内容添加到标题中:
@property (nonatomic, retain) NSDictionary *_parameters;
@property (nonatomic, retain) NSString *_lastReturnResult;
并且还将以下方法添加到类实现的底部:
//Used by NK to receive parameters from JS to a method
- (void)setNKParameters:(NSDictionary *)parameters {
self._parameters = parameters;
}
//Used by NK to return result back to JS without a return call
- (NSString*)methodResult {
return self._lastReturnResult;
}
现在使用这些函数,这是一个可以从iOS类接收生成的NSString的示例!首先是Javascript:
// Note the &sync=yes, this makes the call synchronous which ensures it will return a result before moving on
var eventArrayString = CallNKitAction("GetEventsFunction?className=FNGetEvents&fromDate="+fromDate+"&toDate="+toDate+"&sync=yes");
NKLog("eventString:"+eventArrayString);
现在是Objective-C类(请注意返回类型为void,并且它不接受典型意义上的参数,这是因为它们以不同方式传入/返回):
- (void) GetEventsFunction {
// Get the passed parameters from Javascript
NSString *fromDate = [self._parameters objectForKey:@"fromDate"];
NSString *toDate = [self._parameters objectForKey:@"toDate"];
NSString *resultString;
/* Do stuff with the passed parameter(s) here... */
// Now return the result back to the Javascript side
self._lastReturnResult = resultString;
}
然后你去,不仅使用NimbleKit从Javascript传递对象到Objective-C,而且甚至返回Javascript的结果也可以使用!对于这些方面的更多资源,NimbleKit论坛上出现了一个很棒的项目,涵盖了很多混合JS / iOS功能here.