2012-02-08 3 views
1

일부 json 이미지를 UIScrollView에 넣으려고합니다. 사소한 문제가 발생합니다.JSON 이미지 (UIScrollView)

NSArray *immm = [NSArray arrayWithObjects:[UIImage imageNamed:@"cat.png"], [UIImage imageNamed:@"dog1.png"], nil]; 

for (int i = 0; i < immm.count; i++) { 
    CGRect frame; 
    frame.origin.x = self.scrollView.frame.size.width * i; 
    frame.origin.y = 0; 
    frame.size = self.scrollView.frame.size; 

    UIImageView *subview = [[UIImageView alloc] initWithFrame:frame]; 
    subview.image = [immm objectAtIndex:i]; 
    [self.scrollView addSubview:subview]; 
} 

및 구문 분석이 잘 작동, 그 내가 쓴 JSON 파일 (올바른 형식과 : 는 임 5 JSON 파서

있는 ScrollView가 같이있는 NSArray와 함께 잘 작동 네이티브 아이폰 OS와 함께있는 NSDictionary로 JSON 파일을 구문 분석 인증 됨)이 형식에있는 NSDictionary를 반환은() 때문에 긴 URL의 잘린 절단 및 JSON 파일의 일부를 붙여 있지만 제대로 JSON 검사기와 검증 :

{ 
header =  { 
    main =   (
        { 
      img = "http://******.png"; 
      title = Dog; 
     } 
); 
}; 

}

그러나 메신저는 실제 JSON 데이터 자체에 실수를하고, 필자는 루프 전에 배열을 만드는 시도 :

NSMutableDictionary *jsonDict = (NSMutableDictionary*)[NSJSONSerialization JSONObjectWithData:theData options:kNilOptions error:&error]; 
NSLog(@"%@", jsonDict); 

theArray = [[jsonDict objectForKey:@"header"] objectForKey:@"main"]; 


for (NSDictionary *images in theArray){ 
    tempArray = [[ NSMutableArray alloc] initWithObjects:[UIImage imageWithData: [NSData dataWithContentsOfURL: [NSURL URLWithString: [jsonDict objectForKey:@"img"]]]], nil]; 

} 

과 몇 가지 다른 방법을하지만 난 그냥 벽돌 벽에 충돌했다, 나도 해요 빈 화면이나 크래시가 발생했습니다. (지금 당장 크래시를 다시 만들지 마십시오.) 그래서 ScrollView에서 제대로 사용할 배열을 만들지는 않습니다. 빈 변수가 아닌 NSLog를 사용하면 null이 아니라 단지 비어 있습니다. 그 빈 아무것도 상점의 권리 금액, JSON 파일에서 5 개 이미지, 5(), 인쇄

건배

답변

2

당신은 valueForKeyPath를 사용할 수 있습니다 잡아 방법은 하나를 사용하여 JSON 깊은 여러 수준의 객체는 다음과 같이 이동 : 그것은 배열을 발견 한 경우 자동으로 다음을 적용하기 때문에

NSArray *imageURLs = [jsonDict valueForKeyPath:@"header.main.img"]; 

valueForKeyPath 방법은 영리하다 이 배열의 모든 항목에 대한 경로에있는 비트는 주 배열의 모든 객체 내부에있는 모든 img 요소를 한 줄에 잡는 방법입니다.

다음을 수행, 이미지의 배열이 변환하려면 :

NSMutableArray *tempArray = [NSMutableArray array]; 
for (NSString *imageURL in imageURLs) 
{ 
    NSURL *URL = [NSURL URLWithString:imageURL]; 
    NSData *data = [NSData dataWithContentsOfURL:URL]; 
    UIImage *image = [UIImage imageWithData:data]; 
    [tempArray addObject:image]; 
} 

참고 :이 실행하는 데 시간이 오래 걸릴 것 [을 NSData dataWithContentsOfURL : URL] 때문에 각 URL을 다운로드하는 데 몇 초가 걸릴 수 있습니다. 이 작업은 백그라운드 스레드에서 실행하거나 NSURLConnection을 사용하여 다운로드를 수행해야합니다.

또는 this one과 같은 비동기 이미지 다운로드 라이브러리를 사용하는 것이 좋습니다. 그렇게하면 UIImageViews에 URL로 이미지를 할당 할 수 있으며 인터페이스를 차단하지 않고 백그라운드에서 이미지를 다운로드 할 수 있습니다.

예 : 이것은 다음로드되면 다음로드와 이미지 페이딩 동안 이미지 뷰에 스피너를 보여주는 이미지를 자동으로 로딩 할

AsyncImageView *myImageView = [[AsyncImageView alloc] initWithFrame:CGRect(0,0,100,100)]; 
myImageView.imageURL = [NSURL URLWithString:SOME_STRING_FROM_THE_imageURLs_ARRAY]; 

. 다시 표시하려면 다음에 캐시됩니다.

+0

valueforPath 놀랍습니다, 그것은 완벽하게 배열을 만듭니다. 하지만 그것은 배열에서 충돌하지만 나는 사실을 알고 있기 때문에 그 문자열은 URL을 그래서 그들은 직접 적용 할 수 없습니다 ImageWith 데이터, DataWithContentsOfUrl, UrlWithstring 등 – Elmo

+0

서사시 ​​응답과 같은 형식이 필요합니다. 나는 아직 작동하지는 못했지만 당신은 나에게 많이 일하게해서 대답을 받아 들였고 나 자신도 배쉬를 가지고있다. 라이브러리를 가져 주셔서 감사합니다. 훌륭하게 들립니다. 다시 한 번 감사드립니다. – Elmo

0
for (NSDictionary *images in theArray) 
{ 
    theArray = ...; 
} 

우선 당신이 바로 후 편집하고 같은 배열을 통해 반복되지만, 아마도 게시물에 오타가있을 것입니다.

JSON 사전의 올바른 개체에 액세스하고 있습니까? 더 많은 것 같습니다

[[jsonArray objectForKey:@"main"] objectForKey:@"img"] 

또는 뭔가.

+0

죄송합니다. 테스트 프로젝트가 잘못되었으므로 죄송합니다. 형식이 잘못되었습니다. 위의 편집을 확인, 바로 데이터에 액세스 할 수 있습니다 NSLog 특정 단어에서 특정 변수 – Elmo

관련 문제