В iOS 8 контроллеры представлений теперь могут вызывать showDetailViewController:sender:
, чтобы система определяла правильный контроллер представления, чтобы представить контроллер подробного представления.
В моем приложении у меня есть UISplitViewController, который содержит два UINavigationControllers в своем массиве viewControllers. Первый UINavigationController содержит мой "главный" вид, подкласс UITableViewController. Второй UINavigationController содержит мое представление "detail".
Поскольку я пытаюсь сделать эту работу универсально, я пытаюсь использовать showDetailViewController:sender:
для отображения подробного представления:
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
self.itemVC.item = self.itemStore.items[indexPath.row];
[self showDetailViewController:self.itemVC sender:self];
}
Это отлично работает с характеристикой Horizontal Compact (стиль iPhone), когда self.splitViewController.collapsed == YES
, но не тогда, когда черта является регулярной (iPad не рушится). На iPad он заменяет деталь UINavigationController нечетным контроллером подробных представлений (вместо замены этого массива viewControllers UINavigationController).
Чтобы обойти это, я тестировался на то, рушился он или нет, и если это не так, я завершу контроллер подробного представления в другой UINavigationController, прежде чем показывать его:
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
self.itemVC.item = self.itemStore.items[indexPath.row];
UIViewController *vcToShow;
// For whatever reason, when not collapsed, showDetailViewController replaces the detail view, doesn't push onto it.
if (self.splitViewController.collapsed) {
vcToShow = self.itemVC;
} else {
vcToShow = [[UINavigationController alloc] initWithRootViewController:self.itemVC];
}
[self showDetailViewController:vcToShow sender:self];
}
В качестве альтернативы я мог бы просто настроить self.itemVC
и вообще не называть showDetailViewController:sender:
при self.splitViewController.collapsed == NO
:
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
self.itemVC.item = self.itemStore.items[indexPath.row];
// For whatever reason, when not collapsed, showDetailViewController replaces the detail view, doesn't push onto it.
if (self.splitViewController.collapsed) {
[self showDetailViewController:vcToShow sender:self];
}
}
Но это похоже на то, что он побеждает цель showDetailViewController:sender:
, которая должна ослабить связь между self
и остальной иерархией представлений.
Есть ли лучший способ справиться с этим?