генерация objectForKey из массива - PullRequest
0 голосов
/ 26 апреля 2010

У меня есть успех, когда я использую этот код, чтобы получить строку из массива имен файлов с именем "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"];

или это:

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

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

1 Ответ

2 голосов
/ 26 апреля 2010

У меня есть успех, когда я использую этот код для получения строки из массива имен файлов с именем "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. Вы ищите объект для ключа «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, но это не словарь.

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

...