Первая проблема заключается в том, что методы setXXX в DetailViewController пытаются выполнять вызовы к super setXXX, но поскольку DetailViewController является подклассом UIViewController, эти вызовы к super не будут выполняться, потому что UIViewController не имеет таких методов. Удалите вызовы super в методах setXXX.
Вторая проблема заключается в том, что методы setXXX устанавливают элементы управления непосредственно в DetailViewController, но элементы управления не будут доступны, пока не будет загружено представление, поэтому он не будет работать, если методы будут вызваны до вызова pushViewController.
Если вы измените код в didSelectRowAtIndexPath следующим образом, он должен работать:
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
DetailViewController *detailViewController = [[DetailViewController alloc] initWithNibName:@"DetailView" bundle:nil];
[self.navigationController pushViewController:detailViewController animated:YES];
[detailViewController setName:@"name here"];
[detailViewController setPublisher:@"publisher here"];
[detailViewController setIcon:yourImageVariableHere];
[detailViewController release];
}
Хотя указанное выше изменение должно работать, вы можете рассмотреть возможность создания ivars для хранения значений в DetailViewController (вместо использования самих элементов управления пользовательского интерфейса для хранения данных). Затем создайте для них свойства, используя @property и @synthesize. Свойства могут быть установлены сразу после создания DetailViewController, и в viewDidLoad представления вы можете установить элементы управления пользовательского интерфейса в значения свойств. Это даст DetailViewController больше контроля над тем, как обновляется его пользовательский интерфейс, что позволит вам изменять пользовательский интерфейс, не влияя на вызывающих, и его не нужно отображать для установки его свойств.