пытается установить numberOfRowsInSection со значениями NSDictionary - PullRequest
1 голос
/ 22 сентября 2011

Я пытаюсь настроить свой uitableview для индексации, у меня есть несколько секций, которые работают нормально, и теперь данные в NSDictionary, вот мой вывод с помощью nslog --->

Dictionary: {
    H =     (
        Honda,
        Honda,
        Honda,
        Honda,
        Honda,
        Honda,
        Honda
    );
    M =     (
        Mazda,
        Mazda,
        Mitsubishi,
        Mitsubishi,
        Mitsubishi,
        Mitsubishi,
        Mitsubishi,
        Mitsubishi
    );
    N =     (
        Nissan,
        Nissan,
        Nissan,
        Nissan,
        Nissan,
        Nissan,
        Nissan
    );
    T =     (
        Toyota,
        Toyota,
        Toyota
    );

Я сейчас пытаюсь накрыть свой стол вот так

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
    // Return the number of sections.
    return [arraysByLetter count];
    //return 0;
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    // Return the number of rows in the section.
    return [[arraysByLetter objectAtIndex:section] count];
    //return 1;
}

однако я получаю предупреждение 'NSMutableDictionary' может не отвечать на 'objectAtIndex:' внутри моего метода делегата numberOfRowsInSection ... Как мне обойти это?

Ответы [ 4 ]

1 голос
/ 22 сентября 2011

objectAtIndex - это метод массива, а не метод словаря.Я использую словари для источников данных таблиц следующим образом:

- (NSInteger)tableView:numberOfRowsInSection:
{
NSArray *keys = [arraysByLetter allKeys];
NSArray *sortedKeys = [keys sortedArrayUsingSelector:@selector(caseInsensitiveComapre:)];

return [[arraysByLetter objectForKey:[sortedKeys objectAtIndex:section]] count];
}

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

1 голос
/ 22 сентября 2011

Предупреждающее сообщение точно сообщает вам, в чем проблема: arraysByLetter является экземпляром NSMutableDictionary, а не NSArray (или его подклассом NSMutableArray), и поэтому не отвечает на NSArray методы такие как objectAtIndex:.

Вместо этого вы должны использовать NSDictionary метод objectForKey: и передавать букву алфавита, которая соответствует предоставленному номеру раздела. Вы можете использовать оператор switch или массив строк, чтобы выяснить, какой ключ выбрать.

1 голос
/ 22 сентября 2011

Вы не можете индексировать словарь как массив.Вы получаете доступ к словарям, используя ключи.NSDictionary предоставляет два метода для получения массивов: allKeys и allValues.

Я не уверен, что вы пытаетесь достичь, но если вы хотите организовать автопроизводителей в алфавитном порядке, вы можете получить все ключи ([arraysByLetter allKeys]), отсортируйте их в алфавитном порядке, а затем проиндексируйте в этом отсортированном массиве.Когда вы на самом деле получите имена автопроизводителей, вы будете использовать objectForKey: для загрузки массива автопроизводителей.

Обновление: Принимая отсортированный массив с именем sortedLetters, вы можете изменить свой numberOfRowsInSection наследующее:

NSString *currentLetter = [sortedLetters objectAtIndex:section];
return [[arraysByLetter objectForKey:currentLetter] count];

Возможно, вы захотите настроить массив sortedLetters при инициализации, если он не динамический.

0 голосов
/ 22 сентября 2011

Это потому, что вы не можете использовать objectAtIndex в словаре.Вам нужно сначала извлечь объекты из вашего словаря, используя objectForKey в вашем словаре, а затем создать массив из этих объектов.Затем вы можете использовать objectAtIndex для этого массива (массив объектов массива) и использовать счетчик результата.Или будет достаточно простого сообщения allValues ​​в ваш словарь.

РЕДАКТИРОВАТЬ:

В вашем случае, если вам нужно, чтобы в первом разделе было семь строк (семь хонд), создайте массив и поместитесловарь allValues] как его содержание.Используйте этот массив внутри вашего метода numberOfRowsInSection, как вы делаете это сейчас со своим словарем.

...