将Javascript字符串(NimbleKit)传递给Objective-C函数?

时间:2011-10-13 04:43:11

标签: javascript objective-c ios

我正在编写一个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,都无济于事。
很抱歉有很长的解释,但有没有人对如何实现这一点有任何想法? (也曾在他们的论坛上问过,但也没有在这里发帖的非常大的社区。)帮助将不胜感激。

1 个答案:

答案 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.