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
。它与 navigationController
和 tabBarController
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/