Во-первых, я понимаю, что оригинальный постер, вероятно, давно перестал нуждаться в ответе на этот вопрос.Поскольку недавно мне нужно было искать похожий вопрос, я не нашел подходящего вопроса / ответа, я решил начать копать сам и нашел ответ, который может быть полезен для кого-то другого.
Как уже упоминалось@Wes, шаблон, предоставленный в XCode для «Master-Detail Application», создает полезную отправную точку для создания универсального приложения с контроллером представления:
XCode 4.2 Диалог нового проекта
также обязательно выберите Universal ..
Однако я обнаружил, что, по сути, не было очевидным,что при использовании приложения в качестве приложения для iPhone вы получите вызов метода setDetailItem:
в detailViewController (который, в свою очередь, вызовет configureView
), этого не произойдет автоматически в версии приложения для iPad,это связано с тем, что значение параметра _detailViewController ivar (сопоставленное свойством detailViewController) в masterViewController по умолчанию равно nil.
Это связано с тем, что в версии для iPhone при выборе элемента сведений код по умолчанию проверяет, равен ли этот iVar значению ноль, и автоматически создает его для вас.однако в версии для iPad [appDelegate application: didFinishLaunchingWithOptions:]
уже создал для вас один detailViewController вместе с masterViewController.чтобы это работало в моем коде, я добавил следующие строки в методе [appDelegate application: didFinishLaunchingWithOptions:]
следующим образом:
masterViewController.detailViewController = detailViewController;
[masterViewController tableView:masterViewController.tableView
didSelectRowAtIndexPath:[NSIndexPath indexPathForRow:0 inSection:0]];
Вторая строка автоматически выбирает первый элемент сведений для вас при запуске приложения.Это безопасно в демонстрационном коде по умолчанию, потому что он настроен на обработку 1 детали.если вы собираетесь изменить это в своем коде (например, путем динамического создания элементов детализации из какого-либо другого источника), вам, конечно, необходимо убедиться, что в позиции 0 есть действительный элемент детализации, который можно выбрать в позиции 0.
Метод (после того, как я добавил эти 2 строки) теперь выглядит следующим образом:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
self.window = [[[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]] autorelease];
// Override point for customization after application launch.
if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPhone) {
MasterViewController *masterViewController = [[[MasterViewController alloc] initWithNibName:@"MasterViewController_iPhone" bundle:nil] autorelease];
self.navigationController = [[[UINavigationController alloc] initWithRootViewController:masterViewController] autorelease];
self.window.rootViewController = self.navigationController;
} else {
MasterViewController *masterViewController = [[[MasterViewController alloc] initWithNibName:@"MasterViewController_iPad" bundle:nil] autorelease];
UINavigationController *masterNavigationController = [[[UINavigationController alloc] initWithRootViewController:masterViewController] autorelease];
DetailViewController *detailViewController = [[[DetailViewController alloc] initWithNibName:@"DetailViewController_iPad" bundle:nil] autorelease];
UINavigationController *detailNavigationController = [[[UINavigationController alloc] initWithRootViewController:detailViewController] autorelease];
masterViewController.detailViewController = detailViewController;
[masterViewController tableView:masterViewController.tableView
didSelectRowAtIndexPath:[NSIndexPath indexPathForRow:0 inSection:0]];
self.splitViewController = [[[UISplitViewController alloc] init] autorelease];
self.splitViewController.delegate = detailViewController;
self.splitViewController.viewControllers = [NSArray arrayWithObjects:masterNavigationController, detailNavigationController, nil];
self.window.rootViewController = self.splitViewController;
}
[self.window makeKeyAndVisible];
return YES;
}
Надеюсь, это полезно для вас.