Поскольку нижний пример работает, как и ожидалось, и, кроме строки URL, пример выглядит так же, проблема должна быть в получении строки URL. Проблема также в том, что код выглядит так же, но его довольно сложно увидеть. Я бы рефакторинг кода что-то вроде:
NSObject *urlObject = [[promoList objectAtIndex:promoIndex] objectForKey:@"image"];
NSString *urlString = [NSString stringWithFormat:@"%@", urlObject];
NSURL *url = [NSURL URLWithString:urlString];
NSData *imageData = [NSData dataWithContentsOfURL:url];
UIImage *image = [UIImage imageWithData:imageData];
[[detailViewController detailImage] setImage:image];
Затем вы можете правильно отладить оператор и убедиться, что вы получаете то, что ожидаете, после каждого шага.
Обновление
Для удаления новой строки и вкладок вы можете:
NSString *urlString = [NSString stringWithFormat:@"%@", urlObject];
urlString = [urlString stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];
Если urlObject уже является строкой, что и должно быть, то вы можете сделать:
NSString *urlString = [urlObject stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];
, что сделало бы его немного чище.