在iPhone上为UISplitViewController提供详细信息视图控制器

时间:2014-11-21 19:35:37

标签: ios iphone ios8 uisplitviewcontroller

我很困惑如何处理除了处理像iPad这样的分割视图控制器的6 Plus之外的iPhone上的分割视图控制器。我希望详细视图控制器成为那些iPhone上出现的根视图控制器。

修改

通过添加这两个委托方法,我能够获得我想要的行为。现在拆分视图控制器折叠到详细视图控制器而不是iPhone上的主视图控制器。

- (UIViewController *)primaryViewControllerForCollapsingSplitViewController:(UISplitViewController *)splitViewController
{
    return self.detailNavigationController;
}

- (BOOL)splitViewController:(UISplitViewController *)splitViewController collapseSecondaryViewController:(UIViewController *)secondaryViewController ontoPrimaryViewController:(UIViewController *)primaryViewController
{
    return YES;
}

问题1

当我将主视图控制器推送到iPhone上的详细视图控制器的导航控制器时,我现在在控制台中收到此消息。它工作正常,所以我不明白为什么我收到这条消息。

Unbalanced calls to begin/end appearance transitions for <MasterTableViewController: 0x7fc8d2b67220>.

问题2

我不清楚检测拆分视图控制器何时在iPhone上崩溃的首选方法。我正在使用UIViewControllerShowDetailTargetDidChangeNotification通知来检测此更改,但我觉得应该有这种更改的委托方法。

1 个答案:

答案 0 :(得分:1)

如果您使用默认模板创建了UISplitViewController,您将在AppDelegate文件中找到此方法

- (BOOL)splitViewController:(UISplitViewController *)splitViewController collapseSecondaryViewController:(UIViewController *)secondaryViewController ontoPrimaryViewController:(UIViewController *)primaryViewController {
    if ([secondaryViewController isKindOfClass:[UINavigationController class]] && [[(UINavigationController *)secondaryViewController topViewController] isKindOfClass:[DetailViewController class]] && ([(DetailViewController *)[(UINavigationController *)secondaryViewController topViewController] detailItem] == nil)) {
        // Return YES to indicate that we have handled the collapse by doing nothing; the secondary controller will be discarded.
        return YES;
    } else {
        return NO;
    }
}

返回YES时,此方法处理小屏幕设备中UISplitViewController的默认行为,以解决您必须返回NO的问题。将方法替换为下面的代码

- (BOOL)splitViewController:(UISplitViewController *)splitViewController collapseSecondaryViewController:(UIViewController *)secondaryViewController ontoPrimaryViewController:(UIViewController *)primaryViewController {
    if ([secondaryViewController isKindOfClass:[UINavigationController class]] && [[(UINavigationController *)secondaryViewController topViewController] isKindOfClass:[DetailViewController class]] && ([(DetailViewController *)[(UINavigationController *)secondaryViewController topViewController] detailItem] == nil)) {
        // Return YES to indicate that we have handled the collapse by doing nothing; the secondary controller will be discarded.
        return NO;
    } else {
        return NO;
    }
}

查看documentation