iOS - 拆分视图控制器 - 如何从主视图控制器内部获取指向详细视图控制器的指针(引用)? [英] iOS - Split View Controller - How do I get a pointer (reference) to the Detail View Controller from inside the Master View Controller?

查看:89
本文介绍了iOS - 拆分视图控制器 - 如何从主视图控制器内部获取指向详细视图控制器的指针(引用)?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

iOS - 拆分视图控制器 - 如何从主视图控制器(较小的左侧控制器)内部获取指向详细视图控制器(较大的右侧控制器)的指针(参考)?

iOS - Split View Controller - How do I get a pointer (reference) to the Detail View Controller (the bigger right one) from inside the Master View Controller (the smaller left one)?

我的直觉告诉我主分割视图控制器应该引用细节视图控制器和我自己的主视图控制器,但我无法弄清楚如何获得它。

My gut tell me the Main Split View Controller should have a reference to Detail View Controller and to my own Master View Controller, but I can't figure out how to get it.

有什么想法吗?

推荐答案

拆分视图控制器有参考通过 viewControllers 属性到他们的主视图和详细视图控制器。

Split view controllers do have references to their master and detail view controllers, via the viewControllers property.

在iOS 7.x及更低版本中, viewControllers 数组中应该只有两个视图控制器对象。第一个对象是主视图控制器,第二个对象是详细视图控制器。

In iOS 7.x and below, the viewControllers array should have exactly two view controller objects in it. The first object is the master view controller and the second object is the detail view controller.

在iOS 8.0及更高版本中, viewControllers 数组中至少有一个视图控制器对象 - 主(或主)视图控制器。如果第二个视图控制器对象在数组中,则它是详细信息(或辅助)视图控制器。折叠拆分视图控制器时,只有主视图控制器位于此数组中,展开时它将包含主视图控制器和详细视图控制器。

In iOS 8.0 and above, the viewControllers array has at least one view controller object in it – the master (or "primary") view controller. If a second view controller object is in the array, then it is the detail (or "secondary") view controller. When the split view controller is collapsed, only the master view controller is in this array, and when expanded it will contain both the master and the detail view controllers.

您可以使用所有视图控制器的 splitViewController 属性来获取拆分视图控制器,并从那里使用 viewControllers 属性来访问您的主控制器或详细视图控制器,如下所示:

You can use the splitViewController property of all view controllers to get your split view controller, and from there use the viewControllers property to access either your master or detail view controllers, like so:

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 属性通过向上走视图控制器层次结构并尝试查找调用视图控制器所在的任何拆分视图控制器。如果视图控制器不在拆分视图控制器中,则属性为 nil 。它的工作原理与 navigationController tabBarController 视图控制器属性相同。

The splitViewController property works by walking up the view controller hierarchy and trying to find any split view controller that the calling view controller is in. If the view controller is not in a split view controller, then the property is nil. It works the same as the navigationController and tabBarController view controller properties.

您可以使用 UISplitViewController 中的Swift扩展(或Objective-C中的类别)更容易地访问主视图控制器和详细视图控制器(如下所示)所有 xx _ 都有你自己的前缀,如果你使用的是Objective-C):

You can make the master and detail view controllers easier to access using an extension in Swift (or a category in Objective-C) on UISplitViewController, like so (replacing all the xx_'s with your own prefix if you're using 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

然后您可以使用这些属性如下:

You can then make use of these properties like so:

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 - 拆分视图控制器 - 如何从主视图控制器内部获取指向详细视图控制器的指针(引用)?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆