iOS - 拆分视图控制器 - 如何从主视图控制器内部获取指向详细视图控制器的指针(引用)?

uno*_*nom 26 uisplitviewcontroller ios

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

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

有什么想法吗?

Tyl*_*ler 62

拆分视图控制器通过属性确实可以引用其主视图控制器和详细视图控制器viewControllers.

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

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

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

迅速:

let masterVC = self.splitViewController?.viewControllers.first
let detailVC = (self.splitViewController?.viewControllers.count > 1) ? self.splitViewController?.viewControllers[1] : nil
Run Code Online (Sandbox Code Playgroud)

Objective-C的:

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

splitViewController属性通过向上走视图控制器层次结构并尝试查找调用视图控制器所在的任何拆分视图控制器来工作.如果视图控制器不在拆分视图控制器中,则属性为nil.它navigationControllertabBarController视图控制器属性的工作方式相同.

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

迅速:

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

    var secondaryViewController: UIViewController? {
        return self.viewControllers.count > 1 ? self.viewControllers[1] : nil
    }
}
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

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

迅速:

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"
}
Run Code Online (Sandbox Code Playgroud)

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";
}
Run Code Online (Sandbox Code Playgroud)

  • `viewControllers`属性_may_只包含一个视图控制器,"..当展开拆分视图界面时,此属性包含两个视图控制器;**折叠时,此属性仅包含一个视图控制器**.第一个视图控制器在数组中始终是主(或主)视图控制器.如果存在第二个视图控制器,该视图控制器是辅助(或详细)视图控制器..." (6认同)
  • 如何在崩溃时访问DetailsViewController? (4认同)
  • 哇...不知道所有的View Controller都有一个splitViewController属性用于此目的。大!谢谢! (2认同)