У меня есть успех, когда я использую этот код для получения строки из массива имен файлов с именем "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
.
- Вы ищите объект для ключа «duration» в словаре
stats
и задаете durationLabel
text
для этого объекта.
или это:
NSDictionary *stats = [thisRecordingsStats objectForKey:@"%@",[[[self.fileList objectAtIndex:[indexPath row]] lastPathComponent] stringByDeletingPathExtension]];
Добавление части @"%@",
не имеет смысла, поскольку objectForKey:
не принимает строку формата. Сравните документацию для метода stringWithFormat:
NSString с документацией для objectForKey:
метода NSDictionary .
Код «работает», потому что то, что вы передали в качестве аргумента objectForKey:
, является выражением запятой. Запятая оператор С оценивает обе стороны и справа. Однако в этом случае, как и в большинстве других, это ничего не добавляет. По таким причинам оператор запятой редко используется и еще реже используется специально.
Вырежьте @"%@",
часть.
Вернуться к проблеме:
Обе сборки без ошибок, и журнал показывает, что мои данные есть: но я получаю пустую UILabel.
Ну, вы говорите, что ключ, который вы генерируете из строки в вашем массиве fileList
, отображается в UILabel, поэтому проблема в одном из них:
thisRecordingStats
- это nil
.
thisRecordingStats
не содержит объект для ключа, который вы сгенерировали из строки в self.fileList
.
thisRecordingStats
содержит объект для ключа, который вы сгенерировали из строки в self.fileList
, и это словарь, но он не содержит значения для ключа «duration».
thisRecordingStats
содержит объект для ключа, который вы сгенерировали из строки в self.fileList
, и это словарь, и он содержит значение для ключа «duration», но это значение пустое (ноль - длина) строка.
Вам также следует проверить консоль отладчика на наличие сообщений, предлагающих другие проблемы. Например, сообщение «не отвечает селектору» может быть вызвано тем, что thisRecordingStats
содержит объект для ключа, который вы сгенерировали из строки в self.fileList
, но это не словарь.
Наконец, я предлагаю создать один или несколько объектов модели классов вместо словари, как это. Это значительно облегчает чтение и отладку кода. В частности, словари, которые якобы имеют объекты для ключа «длительность», должны быть объектами модели.