iOS - Split View Controller - 如何从主视图 Controller 内部获取指向详细 View Controller 的指针(引用)?

标签 ios uisplitviewcontroller

iOS - Split View Controller - 如何从主视图 Controller (左侧较小的 Controller )内部获取指向详细 View Controller (右侧较大的 Controller )的指针(引用)?

我的直觉告诉我 Main Split View Controller 应该引用 Detail View Controller 和我自己的 Master View Controller,但我不知道如何获取它。

有什么想法吗?

最佳答案

Split View Controller 确实通过viewControllers 属性引用了它们的主视图 Controller 和详细 View Controller 。

在 iOS 7.x 及以下版本中,viewControllers 数组中应该正好有两个 View Controller 对象。第一个对象是主视图 Controller ,第二个对象是详细 View Controller 。

在 iOS 8.0 及更高版本中,viewControllers 数组中至少有一个 View Controller 对象——主(或“主要”) View Controller 。如果第二个 View Controller 对象在数组中,那么它就是细节(或“辅助”) View Controller 。当 Split View Controller 折叠时,只有主视图 Controller 在这个数组中,当展开时它将包含主视图 Controller 和详细 View Controller 。

您可以使用所有 View Controller 的 splitViewController 属性来获取您的 Split View Controller ,然后使用 viewControllers 属性访问您的主视图 Controller 或详细 View Controller ,像这样:

swift :

let masterVC = self.splitViewController?.viewControllers.first
let detailVC = (self.splitViewController?.viewControllers.count > 1) ? self.splitViewController?.viewControllers[1] : nil

objective-C :

UIViewController *masterVC = [self.splitViewController.viewControllers firstObject];
UIViewController *detailVC;
if (self.splitViewController.viewControllers.count > 1) {
    detailVC = self.splitViewController.viewControllers[1];
}

splitViewController 属性通过在 View Controller 层次结构中向上移动并尝试找到调用 View Controller 所在的任何 Split View Controller 来工作。如果 View Controller 不在 Split View Controller 中,则该属性为 nil。它与 navigationControllertabBarController View Controller 属性的工作原理相同。

您可以在 UISplitViewController 上使用 Swift 中的扩展(或 Objective-C 中的类别)使主视图 Controller 和详细 View Controller 更易于访问,就像这样(替换所有 xx_ 如果您使用的是 Objective-C,请使用您自己的前缀):

swift :

extension UISplitViewController {
    var primaryViewController: UIViewController? {
        return self.viewControllers.first
    }

    var secondaryViewController: UIViewController? {
        return self.viewControllers.count > 1 ? self.viewControllers[1] : nil
    }
}

objective-C :

// UISplitViewController+ChildViewControllerAccess.h
@interface UISplitViewController (ChildViewControllerAccess)

@property (nonatomic, readonly) UIViewController *xx_primaryViewController;
@property (nonatomic, readonly) UIViewController *xx_secondaryViewController;

@end

// UISplitViewController+ChildViewControllerAccess.m
@implementation UISplitViewController (ChildViewControllerAccess)

- (UIViewController *)xx_primaryViewController
{
    return self.viewControllers.firstObject;
}

- (UIViewController *)xx_secondaryViewController
{
    return self.viewControllers.count > 1 ? self.viewControllers[1] : nil;
}

@end

然后您可以像这样使用这些属性:

swift :

func someFunctionInSomeViewControllerClass {
    // Get the primary and secondary view controllers if
    // this view controller is in a split view controller.
    // These will be nil if this view controller is not a
    // descendant of a split view controller.
    var primaryVC = self.splitViewController?.primaryViewController
    var secondaryVC = self.splitViewController?.secondaryViewController

    // Do something with them
    primaryVC?.title = "This is the primary VC"
    secondaryVC?.title = "This is the secondary VC"
}

objective-C :

#import "UISplitViewController+ChildViewControllerAccess.h"

[...]

- (void)someMethodInSomeViewControllerClass
{
    // Get the primary and secondary view controllers if
    // this view controller is in a split view controller.
    // These will be nil if this view controller is not a
    // descendant of a split view controller.
    UIViewController *primaryVC = self.splitViewController.xx_primaryViewController;
    UIViewController *secondaryVC = self.splitViewController.xx_secondaryViewController;

    // Do something with them
    primaryVC.title = @"This is the primary VC";
    secondaryVC.title = @"This is the secondary VC";
}

关于iOS - Split View Controller - 如何从主视图 Controller 内部获取指向详细 View Controller 的指针(引用)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25359131/

相关文章:

ios - 从 UIView drawViewHierarchyInRect 获取黑色(空)图像 :afterScreenUpdates:

ios - 从 Swift 函数中的异步调用返回数据

ios - 反转 CMRotationMatrix 的一个单轴的旋转

ios - Ipad 中详细 View 的 SplitView 导航问题

ios - 选择另一个单元格时不会触发 didDeselectItemAt indexPath

ios - 在自定义键盘上需要帮助

ios - 为什么 viewDidLoad 中 self.splitViewController 突然变成 nil 了?

ios - iPad 纵向模式下的 Split View - 弹出按钮标题

ios - UISplitViewController - 隐藏主滑入 View

ios - MKMapView 在选择注释时崩溃,然后立即释放 map View