помощь по сортировке строк NSMutableDictionary, которые являются изображениями URL - PullRequest
1 голос
/ 10 мая 2011

Я хочу заполнить табличную ячейку заголовком и imageurl из списка xml. мне удается сохранить заголовок (NSMutableDictonary * секции) и imageURL (NSMutableDictonary * секцииImg) в 2 NSMutableDictionary соответственно.

/*******This is in viewDidLoad***/
Directory *allDirectory = [appDelegate.directories objectAtIndex:0];

for (allDirectory in appDelegate.directories)
{
    NSDictionary *dica = [NSDictionary dictionaryWithObject:allDirectory.dirTitle forKey:@"dirTitle"];
    NSDictionary *dico = [NSDictionary dictionaryWithObject:allDirectory.imageURL forKey:@"imageURL"];


    [dirName addObject:dica];
    [dirImage addObject:dico];
    //NSLog(@"dic of items : %@",dirImage);


}
for (allDirectory in appDelegate.directories)
{
    //retrieve the first letter from every directory title (dirTitle)
    NSString * c = [allDirectory.dirTitle substringToIndex:3];

    NSString * m = allDirectory.imageURL;



    found = NO;
    find = NO;

    for (NSString *str in [self.sections allKeys])
    {
        if ([str isEqualToString:c])
        {
            found = YES;
        }
    }
    for (NSString *stra in [self.sectionsImg allKeys])
    {
        if([stra isEqualToString:m])
        {
            find = YES;
        }
    }

    if (!found)
    {
            [self.sections setValue:[[NSMutableArray alloc]init] forKey:c ];
            [self.sectionsImg setValue:[[NSMutableArray alloc]init] forKey:m];
    }
    if (!find)
    {
        [self.sectionsImg setValue:[[NSMutableArray alloc]init] forKey:m];
    }

}

for (NSDictionary *directory in dirName)
{
    [[self.sections objectForKey:[[directory objectForKey:@"dirTitle"] substringToIndex:3]] addObject:directory];
    //NSLog(@"hehehe have : %@",sections);
}
for (NSDictionary *directoryImg in dirImage)
{
    //[[self.sectionsImg objectForKey:[[directoryImg objectForKey:@"imageURL"] substringFromIndex:0]] addObject:directoryImg];
    [[self.sectionsImg objectForKey:[directoryImg objectForKey:@"imageURL"]] addObject:directoryImg];

    //NSLog(@"HOHOHO have : %@",sectionsImg);
}

И на cellForRowAtIndexPath я объявляю словарь

NSDictionary *dictionary = [[self.sections valueForKey:[[[self.sections allKeys] sortedArrayUsingSelector:@selector(localizedCaseInsensitiveCompare:)] objectAtIndex:indexPath.section]] objectAtIndex:indexPath.row];
cell.textLabel.text = [dictionary objectForKey:@"dirTitle"];

но когда я попытался объявить словарь для imageURL

NSDictionary *dictionaryImg = [[self.sectionsImg valueForKey:[[[self.sectionsImg allKeys] sortedArrayUsingSelector:@selector(localizedCaseInsensitiveCompare:)] objectAtIndex:indexPath.section]] objectAtIndex:indexPath.row];

это дает мне ошибку: Завершение работы приложения из-за неперехваченного исключения «NSRangeException», причина: '* - [NSMutableArray objectAtIndex:]: индекс 1 за пределами [0 .. 0]'

Есть идеи, почему? логика должна быть такой же, где заголовок и URL XML могут быть извлечены и отображены. Название можно получить, а imageURL - нет. Помощь высоко ценится!

1 Ответ

4 голосов
/ 10 мая 2011

Вы пытаетесь отсортировать массив ... за исключением того факта, что ваш массив не массив, а NSDictionary.

Ваш код на данный момент не самый лучший.Вы неправильно понимаете словари и, возможно, путаете их с массивами, поэтому я думаю, что вы совсем новичок в программировании на target-c.

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

Ниже я собираюсь сделать две вещи:

  • Во-первых, я даю вам два способа решения вашей проблемы.Он содержит пример кода и дает вам небольшое объяснение.Существует возможность, что вы не понимаете части того, что я описываю.В этом случае вам следует:
  • Проверить ссылку, которую я описал ниже, на два решения.В нем есть учебник, который поможет вам понять все о массивах, словарях, таблицах и, в качестве бонуса, разборе XML.

Так что, на мой взгляд, вы можете сделать две вещи:


Первый использует массив NSDictionaries.Вы будете использовать код, который выглядит следующим образом:
NSMutableDictionary *itemOne = [[NSMutableDictionary alloc] init];
NSMutableDictionary *itemTwo = [[NSMutableDictionary alloc] init];
NSMutableArray *listOfAll = [[NSmutableArray alloc] init];
NSString *itemOneName = [[NSString alloc] initWithFormat:@"This is picture 1"];
NSString *itemTwoName = [[NSString alloc] initWithFormat:@"This is picture 2"];
NSData *imageOneData = [[NSData alloc] initWithContentsOfURL: [NSURL URLWithString: @"http://myurl/mypic1.jpg"]];
NSData *imageTwoData = [[NSData alloc] initWithContentsOfURL: [NSURL URLWithString: @"http://myurl/mypic2.jpg"]];
UIImage *itemOneImage = [UIImage imageWithData: imageOneData];
UIImage *itemTwoImage = [UIImage imageWithData: imageTwoData];
[itemOne setObject:itemOneNameString forKey:@"Name"];
[itemOne setObject:itemOneImage forKey:@"Image"];
[itemTwo setObject:itemTwoNameString forKey:@"Name"];
[itemTwo setObject:itemTwoImage forKey:@"Image"];
[listOfAll addObject:itemOne];
[listOfAll addObject:itemTwo];

Все может быть заполнено с использованием этого массива.Просто используйте что-то с циклом for для перебора вашего массива.

for (int i = 0; i < [listOfAll count]; i++)
{
    NSMutableDictionary *currentItem = [[NSMutableDictionary alloc] initWithDictionary:[listOfAll objectAtIndex:i]];
    //Do something with that current item
}

Вы также можете использовать этот индекс в вашем tableView.В этом случае вы должны использовать переменную section вместо i, чтобы получить желаемый индекс.


Второй использует два массива.Представьте, что вы получили изображение с именем imageOne с текстом imageName.Затем вы должны использовать:
NSMutableArray *nameList = [[NSMutableArray alloc] init];
[nameList addObject: imageName];
NSMutableArray *imageList = [[NSMutableArray alloc] init];
[imageList addObject: imageOne];

Если вы хотите использовать определенный элемент из этих списков, вам просто нужно использовать тот же индексный номер.Например:

[theTitleLabel setText:[[NSString alloc] initWithFormat:@"%@", [nameList objectAtIndex:x]]];
[theImageView setImage:[imageList objectAtIndex:x]];

Убедитесь, что х совпадают.


Я понимаю, что это много информации, особенно если вы новичок в Objective - C. Существует учебник, который дает вам много информации о том, как использовать массивы, словари и представления таблиц.В качестве бонуса вы немного узнаете о синтаксическом анализе XML. Я предлагаю вам пройтись по этому учебному пособию, сделать все и прочитать все, что в нем говорится.Это должно дать вам хорошее начало в мире программирования на iPhone.

Удачи!

...