2011-04-19 6 views
1

에있는 NSDictionary 객체를 포함 전달. 지금은 사용하여 웹보기를 통해 자바 스크립트 함수로를 통과해야 : NSArray를 내가있는 NSDictionary 객체를 포함하는 NSArray를 정보의 거대한 세트를 가지고있어서, 내가 요구 사항이 자바 스크립트 기능

- (NSString *)stringByEvaluatingJavaScriptFromString:(NSString *)script 

내 질문

은 다음과 같습니다

  1. 이 어떻게 자바 스크립트를 이해할 수 있도록 발신자 끝에서 내 인수를 준비합니까?
  2. 어떻게 자바 스크립트를 받게됩니까? 기본적으로 함수의 서명은 무엇이며 배열의 사전 객체의 키 - 값 쌍을 java 함수에서 읽는 방법은 무엇입니까?

기본적으로 Javascript와 관련하여 충분한 경험이 없으므로이 질문이 너무 추상적 인 경우 용서해주세요. 제 질문은 분명히 희망합니다.

편집 : across a thread왔다 NSDictionary에 전달하는 자바 스크립트 함수 객체한다고 할 수 없습니다. 그럼 우리는 어떻게 그것을 성취 할 수 있습니까? 당신은 단지 -stringByEvaluatingJavaScriptFromString: 문자열을 제공 할 수 있기 때문에

감사 & 감사합니다, 주권

답변

2

, 당신은 당신의 매개 변수를 직렬화 할 필요가있다. 가장 간단한 방법은 다양한 Cocoa JSON 라이브러리 중 하나를 사용하여 JSON으로 변환하는 것입니다. 그런 다음 코드에 JavaScript 리터럴로 삽입 할 수 있습니다. 뭔가 같이 : 당신이 array[5].someKey (또는 array[5]["some key"])로 자신의 멤버에 액세스 줄 수 있도록 JSON에서

NSString *json = [serialize JSON here]; 
NSString *scriptString = [NSString stringWithFormat:@"doSomething(%@)", json]; 

의 NSDictionaries은 자바 스크립트 개체로 표현됩니다. 아마도-

+0

완벽한 덕분에! 음, 한 가지 더요, JavaScrip 객체 란 정확히 무엇입니까? –

2
또한 rip'em'apart 수

및 문자열 그들을 다시 함께, like it looks this guys is doing....

function stringToNSString(str) { 
    return ['@"',str,'"'].join(''); 
} 
function numberToNSNumber(num) { 
    return ['[NSNumber numberWithLong:',num,']'].join(''); 
} 
function booleanToNSNumber(bool) { 
    return ['[NSNumber numberWithBool:',(bool ? 'YES' : 'NO'),']'].join(''); 
} 

function nullToNSNull(){ 
    return '[NSNull null]'; 
} 

function arrayToNSArray(array){ 
    var lines = _(array).map(function(value){ 
    var convertedValue; 
    if (_(value).isString()) { 
     convertedValue = stringToNSString(value); 
    } else if (_(value).isNumber()) { 
     convertedValue = numberToNSNumber(value); 
    } else if (_(value).isBoolean()) { 
     convertedValue = booleanToNSNumber(value); 
    } else if (_(value).isNull()) { 
     convertedValue = nullToNSNull(); 
    } else if (_(value).isArray()) { 
     convertedValue = arrayToNSArray(value); 
    } else if (typeof value === 'object') { 
     convertedValue = objectToNSDictionary(value); 
    } 
    return convertedValue; 
    }).map(function(value){ 
    return value + ', '; 
    }); 
    lines.unshift('[NSArray arrayWithObjects:'); 
    lines.push('nil]'); 
    return lines.join(''); 
} 
function objectToNSDictionary(obj){ 
    var lines = _(obj).map(function(value,key){ 
    var convertedValue; 
    if (_(value).isString()) { 
     convertedValue = stringToNSString(value); 
    } else if (_(value).isNumber()) { 
     convertedValue = numberToNSNumber(value); 
    } else if (_(value).isBoolean()) { 
     convertedValue = booleanToNSNumber(value); 
    } else if (_(value).isNull()) { 
     convertedValue = nullToNSNull(); 
    } else if (_(value).isArray()) { 
     convertedValue = arrayToNSArray(value); 
    } else if (typeof value === 'object') { 
     convertedValue = objectToNSDictionary(value); 
    } 
    return [convertedValue,stringToNSString(key)]; 
    }).map(function(valueKey){ 
    valueKey.push(''); 
    return valueKey.join(','); 
    }); 
    lines.unshift('[NSDictionary dictionaryWithObjectsAndKeys:'); 
    lines.push('nil]'); 
    return lines.join('\n'); 
} 
0

나는 ☺ ... 편지 많이 똑똑 해요 그리고 나는 생각 어쩌면 ... that this (JSONKit on GitHub)은 더 나은 해결책입니다 .... JSONKit은 다음 Objective-C Foundation 클래스에 매핑 된 다음 기본 유형을 제공합니다.

╭───────────────┬─────────────────────╮ 
│ JSON   │ Objective -C  │ 
├───────────────┼─────────────────────┤ 
│ true|false │ NSNull    │ 
├───────────────┼─────────────────────┤ 
│ Number  │ NSNumber   │ 
├───────────────┼─────────────────────┤ 
│ String  │ NSString   │ 
├───────────────┼─────────────────────┤ 
│ Array  │ NSArray   │ 
├───────────────┼─────────────────────┤ 
│ Object  │ NSDictionary  │ 
╰───────────────┴─────────────────────╯ 

개체Associative Arrays, Key/Value Hash Tables, Maps 또는 Dictionaries이다 등

JSONKit는 내부적하고 는 가정 코어 파운데이션을 사용 그 코어 재단 ≡ 재단 모든 등가 기본 유형, 즉 CFString ≡는 NSString . 또한주의하는, 그들은 ARC-안전하지 말 .

관련 문제