Я имею успех, когда я использую этот код, чтобы получить строку из массива имен файлов под названием «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"];
- Вы вычислить имя файла без расширения, как и раньше.
- Вы просматриваете объект для этой строки в словаре
thisRecordingsStats
, таким образом получаете другой словарь, с помощью которого вы инициализируете переменную stats
.
- Вы просматриваете объект для клавиши «продолжительность» в словаре
stats
и задаете durationLabel
text
.
или это:
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 вместо вложенных словарей, подобных этому. Это делает код намного легче читать и отлаживать. В частности, словари, которые якобы имеют объекты для ключевой «длительности», должны быть образцовыми объектами.
Вы проверили, что thisRecordingStats и статистика не нуль? – nall
Да, 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
статистика равна нулю, но не при установке определенного значения для ключа. – Brian