2009-06-02 5 views
1

Я создал plist, который содержит структуру NSDictionary. Ключ - это метка (которую я использую для заполнения tableview cell.text), а значение - это имя файла, которое я хочу использовать, чтобы «динамически» заполнить cell.image. В проект загружаются точные имена файлов png.Baffled при попытке установить cell.image с использованием UIImage: imageNamed:

Чтобы сделать вещи проще (так я думал), я загружаю plist в NSDictionary, а затем разделяю это на два массива (используя allKeys и allValues).

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

cell.image = [UIImage imageNamed:@"bad.png"]; 

и это не дает (в симуляторе - я получаю сбой приложения и ненадежен в отладчик):

cell.image = [UIImage imageNamed:[rowImageList objectAtIndex:indexPath.row]]; 

я могу поставить эту следующую строку непосредственно перед вторым фрагментом кода, и она работает просто отлично, так что кажется, что я получаю от NSString objectAtIndex:

NSLog(@"Image name: %@", [rowImageList objectAtIndex:indexPath.row]); 

Я также попытался создать временную NSString и присвоить ей [rowImageList objectAtIndex:], а затем использовать NSString для поставки imageNamed :.

Вот некоторая информация из отладчика:

- [длина NSCFArray]: непризнанный селектор направлен например 0x262d910

Нагрузочного приложение из-за неперехваченный исключения 'NSInvalidArgumentException', причина: «* ** - [длина NSCFArray]: непризнанные селектор отправляется например 0x262d910'

Позвольте мне K теперь, если вам нужна дополнительная информация/код.

Edit: Вот как я заселить rowImageList:

NSArray *myRowImages = [[NSArray alloc] init]; 
myRowImages = [searchFilterList allValues]; 
self.rowImageList = [myRowImages copy]; 
[myRowImages release]; 
//where searchFilterList is an NSDictionary that I loaded from a plist 

Вот скриншот моего списка свойств: [IMG] http://i42.tinypic.com/14uwffa.jpg http://i42.tinypic.com/14uwffa.jpg [/ IMG]

Edit: пересмотренная rowImageList население:

NSMutableArray *myRowImages = [[NSMutableArray alloc] init]; 
NSEnumerator *enumerator = [searchFilterList objectEnumerator]; 
id object; 

while ((object = [enumerator nextObject])) { 
    [myRowImages addObject:[object objectAtIndex:0]]; 
} 
self.rowImageList = myRowImages; //edit: added self. prefix 
[myRowImages release]; 
+0

Хм ... Мне придется перепроверить все. rowImageList - это массив, но я предположил, что я «нажимаю» NSStrings на массив (т. е. массив объектов NSString). Вот как я заполняю rowImageList: \t NSArray * myRowImages = [[NSArray alloc] init]; \t myRowImages = [searchFilterList allValues]; \t self.rowImageList = [myRowImages copy]; \t [myRowImages release]; - где searchFilterList - это NSDictionary, который я загрузил из plist. – kindaran

+0

Хороший лорд, который не очень хорошо форматировался. – kindaran

+0

Если вы следуете, я в конце концов изменил «rowImageList = myRowImages;» до "self.rowImageList = myRowImages;" Имел странную дерьмо, пытаясь использовать rowImageList позже в коде. – kindaran

ответ

1

Я бы дважды проверить вывод из NSLog() и убедиться, что это не массив, содержащий NSString. Это то, что говорит вам ошибка; вы передаете NSArray, где ожидается NSString.

+0

Да, вы, ребята, правы. Я возвращал массив вместо строки. Я опубликую новую (но, возможно, еще не совсем правильную) версию загрузки массива. – kindaran

1

Эта ошибка означает, что [rowImageList objectAtIndex: indexPath.row] возвращает массив, а не строку, как ожидалось.

Причина, по которой печатается значение, заключается в том, что для печати массива также необходимо указать% @ в инструкции NSLog.

Попробуйте отладить метод и проверьте класс [rowImageList objectAtIndex: indexPath.row]. Скорее всего, это будет массив.

0

Вы уверены, что ваш plist - это пары ключей/строк, и вы не каким-то образом обернули имена в массиве?

+0

В этот момент я ничего не знаю. Структура plist - Dictionary (root)> Array (child)> String (дочерний элемент массива) с 4 парами Array/String. Я пытался копировать еще один пример plist. Мое предположение заключалось в том, что я создавал структуру NSDictionary, где Array - это ключ, а String - значение. Не знаю, насколько ясно это объяснение. – kindaran

+0

Вы недопонимаете свой plist. Ключами в вашем plist являются строки «Все элементы», «Хорошие позиции» и т. Д. Значения представляют собой массивы. Строки принадлежат массивам. Вы должны добавить NSLog (@ "% @", searchFilterList) и посмотреть, сможете ли вы понять структуру данных. Как вы загружаете этот plist? –

+0

С вашего структурированного массива вы должны использовать: cell.image = [UIImage imageNamed: [[rowImageList objectAtIndex: indexPath.row] objectAtIndex: 0]]; Когда вы используете allValues ​​в словаре, вы возвращаете массив, содержащий четыре массива - каждый из этих массивов содержит строку. NSlog напечатал бы содержимое массива, чтобы он выглядел нормально, но ваш образ был бы нулевым. –