Изображения JSON в UIScrollView - PullRequest
       1

Изображения JSON в UIScrollView

1 голос
/ 08 февраля 2012

Я пытаюсь поместить некоторые изображения JSON в UIScrollView, и у меня возникла небольшая ошибка.Я анализирую JSON-файл в NSDictionary с помощью собственного json-анализатора iOS 5

ScrollView отлично работает с NSArray, например:

    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, который я написал (правильно отформатирован и проверен) и возвращает 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 должным образом, так как он содержит 5 пустых переменных NSLog, а не просто пустые.Его печать правильного количества ничего, 5 изображений в файле JSON, 5 пустых (),

Cheers

Ответы [ 2 ]

2 голосов
/ 08 февраля 2012

Вы можете использовать метод 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 для загрузки.

В качестве альтернативы, вы можете рассмотреть возможность использования библиотеки асинхронной загрузки изображений, такой как эта . Это позволит вам назначать изображения для UIImageViews в вашем интерфейсе по URL-адресу и загружать их в фоновом режиме, не блокируя ваш интерфейс.

Пример:

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

Это автоматически загрузит изображение, показывая спиннер в изображении во время его загрузки, а затем исчезнет в изображении после его загрузки. Затем он будет кэширован в следующий раз, если вы захотите отобразить его снова.

0 голосов
/ 08 февраля 2012
for (NSDictionary *images in theArray)
{
    theArray = ...;
}

Прежде всего, вы просматриваете тот же массив, который вы редактируете сразу после этого, но это, вероятно, просто опечатка в вашем посте.

Вы уверены, что получаете доступ к нужным объектам в своем словаре JSON? Больше похоже на

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

или что-то.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...