如何将 NSArray 传递给 JavaScript 文件并在 JavaScript 中打印该数组?

Posted

技术标签:

【中文标题】如何将 NSArray 传递给 JavaScript 文件并在 JavaScript 中打印该数组?【英文标题】:How can I pass an NSArray to JavaScript file and print that array in JavaScript? 【发布时间】:2013-10-21 07:15:05 【问题描述】:

我正在寻找将一个 NSArray 从 viewcontroller.m 文件发送到 data.js 文件 但它没有在 javascript 中打印任何内容。以下是我的代码。

在我的 viewdidload 方法中

   - (void)webViewDidFinishLoad:(UIWebView*)theWebView

    // Black base color for background matches the native apps
    CDV=[[CDVViewController alloc]init];
    news=[[NSArray alloc]initWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"latest news" ofType:@"plist"]];
    NSArray *newsItems=[[NSArray alloc]init];
    newsItems=[news valueForKey:@"News"];
    NSData *jsonArray = [self arrayToJSON:newsItems];
    NSString *jsonString = [[NSString alloc] initWithData:jsonArray
                                                 encoding:NSUTF8StringEncoding];
    NSString *jsCall = [NSString stringWithFormat:@"yourJsFunction([%@])", jsonString];
    [theWebView stringByEvaluatingJavaScriptFromString:jsCall];
   NSLog(@"%@",jsonString);
   // theWebView.backgroundColor = [UIColor blackColor];

    return [super webViewDidFinishLoad:theWebView];



   - (NSData *) arrayToJSON:(NSArray *) inputArray

    NSError *error = nil;
    id result = [NSJSONSerialization dataWithJSONObject:inputArray
                                                options:kNilOptions error:&error];
    if (error != nil) return nil;
    return result;

在我的 one.js 文件中,我有以下代码:

function yourJsFunction(arr)
    for(var i=0;i<arr.length;i++)
        document.write(arr[i]);
    
    return arr;

输出是:

ഡാറ്റാസെന്റർകേസ്:സത്യവാങ്മൂലംസമർപ്പിക്കാൻഅനുമതി,കാശ്മീർനയത്തിൽമാറ്റമില്ലെന്ന്മാറ്റമില്ലെന്ന്.എസ്“,നിതാഖാത്നിതാഖാത്സമയപരിധി14ദിവസംദിവസം;ഇനിപിടിക്കപ്പെട്ടാൽജയിൽശിക്ഷയുംജയിൽശിക്ഷയും,ഡീസൽഡീസൽ:കെഎസ്ആർടിസിസബ്സിഡിഅപേക്ഷസമർപ്പിക്കണം

但我希望它们中的每一个都分开而不是放“,”

当前输出:

新图片

【问题讨论】:

尝试在 yourJsFunction 函数中登录控制台,以确保您首先到达那里。 你的 arr 参数也可能是一个有效的 json divaka:我没听懂你? divaka:当我打印json字符串值时,我得到了这个[“ഡാറ്റാസെന്റർകേസ്:സത്യവാങ്മൂലംസമർപ്പിക്കാൻഅനുമതി”,“കാശ്മീർനയത്തിൽമാറ്റമില്ലെന്ന്മാറ്റമില്ലെന്ന്യുയു”,“നിതാഖാത്സമയപരിധിതീരാൻ14ദിവസംദിവസം;ഇനിപിടിക്കപ്പെട്ടാൽജയിൽശിക്ഷയും പിഴയും“,”ഡീസൽസബ്സിഡി:കെഎസ്ആർടിസികെഎസ്ആർടിസിഅപേക്ഷഅപേക്ഷ“] span> 尝试在此处将NSJSONSerialization dataWithJSONObject: 的选项从kNilOptions 更改为NSJSONWritingPrettyPrinted 【参考方案1】:

js文件有一些变化 1.使用 toString() 将 arr 转换为正确的字符串 2.拆分新字符串

var b=arr.toString().split(',');

现在打印 document.write(b[1]);它的工作!!!!!

在 .m 文件中就像 "@Divaka" 的选项

尝试在此处更改选项 NSJSONSerialization dataWithJSONObject: from kNilOptions to NSJSONWritingPrettyPrinted

【讨论】:

【参考方案2】:

似乎您在newsItems 变量中传递了一个字符串。然后你调用yourJsFunction([%@]) - 参数是你的参数数组(%@)。然后你尝试打印 js 对象并得到 ["ഡാറ്റാ സെന്റര്‍ കേസ്: സത്യവാങ്മൂലം സമര്‍പ്പിക്കാന്‍ അനുമതി‌ ","കാശ്മീര്‍ നയത്തില്‍ മാറ്റമില്ലെന്ന് യു.എസ്‌","നിതാഖാത്‌ സമയപരിധി തീരാന്‍ 14 ദിവസം മാത്രം; ഇനി പിടിക്കപ്പെട്ടാല്‍ ജയില്‍ശിക്ഷയും പിഴയും‌ ","ഡീസല്‍ സബ്‌സിഡി: കെഎസ്ആര്‍ടിസി പുതിയ അപേക്ഷ സമര്‍പ്പിക്കണം‌ "] 正好是一个字符串对象的数组。请检查您的文件内容,我认为它包含逗号分隔的值。 如果是,则必须将其分解为字符串数组。

NSString *newsString = ...;// loading from plist
NSArray *newsItems = [newsString componentsSeparatedByString:","];

然后将newsItems序列化为json并调用js函数为

NSString *jsCall = [NSString stringWithFormat:@"yourJsFunction(%@)", jsonString];

而不是

NSString *jsCall = [NSString stringWithFormat:@"yourJsFunction([%@])", jsonString];

【讨论】:

以上是关于如何将 NSArray 传递给 JavaScript 文件并在 JavaScript 中打印该数组?的主要内容,如果未能解决你的问题,请参考以下文章

快速将变量传递给drawRect

将 NSArray 从 UIViewController 传递到子视图 [重复]

从 UIViewController 传递 NSArray

将 C# ASP.NET 数组传递给 Javascript 数组

将 C# ASP.NET 数组传递给 Javascript 数组

将数组传递给 ios sdk 中的 .net webservice