2010-04-25 3 views
0

Я имею успех, когда я использую этот код, чтобы получить строку из массива имен файлов под названием «FileList»:генерация objectForKey из массива

cell.timeBeganLabel.text = [[[self.fileList objectAtIndex:[indexPath row]] lastPathComponent] stringByDeletingPathExtension]; 

поэтому я ожидал тот же код для генерации та же строка в качестве ключа для меня в этом:

NSDictionary *stats = [thisRecordingsStats objectForKey:[[[self.fileList objectAtIndex:[indexPath row]] lastPathComponent] stringByDeletingPathExtension]]; 
    cell.durationLabel.text = [stats objectForKey:@"duration"]; 

или это:

NSDictionary *stats = [thisRecordingsStats objectForKey:@"%@",[[[self.fileList objectAtIndex:[indexPath row]] lastPathComponent] stringByDeletingPathExtension]]; 

Оба построить без ошибок, и т он показывает мои данные: но я получаю пустой UILabel.
Правильно ли я написал динамический генератор ключей?

+0

Вы проверили, что thisRecordingStats и статистика не нуль? – nall

+0

Да, NSLog показывает содержание этогоRecordingsStats { "4:37:13 PM, 25 апреля" = { FILEPATH = "/ Пользователи/brian/Библиотека/Поддержка приложений/iPhone Simulator/3.1.3/Приложения/8287F6FC -3965-4E26-A214-E47C0C9B5687/Документы/4: 37: 13 PM, апрель 25.aif "; duration = "00:05"; и т. Д. – Brian

+0

статистика равна нулю, но не при установке определенного значения для ключа. – Brian

ответ

2

Я имею успех, когда я использую этот код, чтобы получить строку из массива имен файлов под названием «FileList»:

cell.timeBeganLabel.text = [[[self.fileList objectAtIndex:[indexPath row]] lastPathComponent] stringByDeletingPathExtension]; 

Таким образом, результатом этого выражения является сообщение ваш ключ, не так ли?

То есть, ключи в вашем словаре - это имена файлов без расширений?

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

NSDictionary *stats = [thisRecordingsStats objectForKey:[[[self.fileList objectAtIndex:[indexPath row]] lastPathComponent] stringByDeletingPathExtension]]; 
cell.durationLabel.text = [stats objectForKey:@"duration"]; 
  1. Вы вычислить имя файла без расширения, как и раньше.
  2. Вы просматриваете объект для этой строки в словаре thisRecordingsStats, таким образом получаете другой словарь, с помощью которого вы инициализируете переменную stats.
  3. Вы просматриваете объект для клавиши «продолжительность» в словаре stats и задаете durationLabeltext.

или это:

NSDictionary *stats = [thisRecordingsStats objectForKey:@"%@",[[[self.fileList objectAtIndex:[indexPath row]] lastPathComponent] stringByDeletingPathExtension]]; 

Добавление @"%@", часть не имеет смысла, так как objectForKey: не принимает строку формата. Сравнить the documentation for NSString's stringWithFormat: method до the documentation for NSDictionary's objectForKey: method.

Код «работает», потому что то, что вы передали как аргумент objectForKey:, является выражением для запятой. Оператор запятой C оценивает обе стороны и оценивает правую часть. Однако в этом случае, как и в большинстве других, он ничего не добавляет. По причинам, подобным этому, оператор запятой редко используется и даже реже используется специально.

Вырезать @"%@", часть наружный.

Назад к проблеме:

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

Ну, вы говорите, ключ вы генерируете из строки в вашем fileList массиве проявляется в UILabel, так что проблема одна из них:

  • thisRecordingStats является nil.
  • thisRecordingStats не содержит объекта для ключа, сгенерированного из строки в self.fileList.
  • thisRecordingStats содержит объект для ключа, сгенерированного из строки в self.fileList, и это словарь, но он не содержит значения для ключа «продолжительность».
  • thisRecordingStats содержит объект для ключа, сгенерированного из строки в self.fileList, и является словарем, и он содержит значение для ключа «продолжительность», но это значение является пустой (нулевой) строкой.

Вы также должны проверить консоль отладчика на наличие сообщений, которые указывают на другие проблемы. Например, сообщение «не отвечает на селектор» может быть связано с тем, что thisRecordingStats содержит объект для ключа, который вы создали из строки в self.fileList, но это не словарь.

Наконец, я предлагаю построить один или несколько классов model object вместо вложенных словарей, подобных этому. Это делает код намного легче читать и отлаживать. В частности, словари, которые якобы имеют объекты для ключевой «длительности», должны быть образцовыми объектами.

+0

ничего себе! спасибо за ваш щедрый ответ. Помимо создания объекта модели, можете ли вы предложить способ получить содержимое объектаAtIndex: 1 из внутреннего массива из внешнего ведения журнала как такового: thisRecordingsStats is { "5:45:02 PM, April 26 "= ( " /Users/.../Documents/5:45:02 PM, April 26.aif ", " 00:04 ", и т. Д. Мое последнее предположение: NSArray * stats = [ thisRecordingsStats objectForKey: key]; \t cell.durationLabel.text = [stats objectAtIndex: 0], который также возвращает пустоту. – Brian

+0

Я не вижу внутреннего массива. Словарь содержит массив как его значения, но массив содержит строки (по крайней мере, пока вы показываете в этой выдержке). Помните, что массивы в какао строго серийны, нет t ассоциативный; массивы не являются словарями. –