2011-10-13 74 views
0

我正在寫一個Javascript類,它將一個參數的函數傳遞給Objective-C類(使用NimbleKit框架)。爲此,它會像這樣:將Javascript字符串(NimbleKit)傳遞給Objective-C函數?

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作爲(常量字符*)是問題。我不知道如何將其調用到函數中,然後將其轉換爲NSString以供使用,到目前爲止,我只是將該字符串作爲NSString,const char傳遞並將其轉換爲使用StringWithUTF8String的NSString,都無濟於事。
對不起,很長的解釋,但沒有人有任何想法如何實現這一目標? (也曾在他們的論壇上發過帖,但並不是一個非常大的社區,所以在這裏也發佈。)幫助將非常感謝。

回答

0

在其他人需要知道的情況下,我添加了如何解決這個非常古老的問題: NimbleKit確實允許通過一些內置參數方法從Javascript到Objective-C傳遞所需參數存儲在NSDictionary中。它甚至允許一個簡單的單行程式將結果返回給調用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; 
} 

現在你去了,不僅僅將對象從Javascript與NimbleKit一起傳遞給Objective-C,甚至還返回Javascript的結果!爲了獲得更多的資源,NimbleKit論壇上出現了一個很棒的項目,它涵蓋了大量的混合JS/iOS功能here.

相關問題