iOS - 拆分视图控制器 - 如何从主视图控制器内部获取指向细节视图控制器的指针(引用)?
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/25359131/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
iOS - Split View Controller - How do I get a pointer (reference) to the Detail View Controller from inside the Master View Controller?
提问by unom
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)?
iOS - 拆分视图控制器 - 如何从主视图控制器(左侧较小的控制器)内部获取指向细节视图控制器(右侧较大的控制器)的指针(引用)?
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.
我的直觉告诉我 Main Split View Controller 应该有对 Detail View Controller 和我自己的 Master View Controller 的引用,但我不知道如何获得它。
Any thoughts?
有什么想法吗?
回答by Tyler
Split view controllers dohave references to their master and detail view controllers, via the viewControllers
property.
拆分视图控制器确实通过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 7.x 及更低版本中,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.
在 iOS 8.0 及更高版本中,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:
您可以使用splitViewController
所有视图控制器的属性来获取拆分视图控制器,然后使用该viewControllers
属性访问您的主视图控制器或详细视图控制器,如下所示:
Swift:
迅速:
let masterVC = self.splitViewController?.viewControllers.first
let detailVC = (self.splitViewController?.viewControllers.count > 1) ? self.splitViewController?.viewControllers[1] : nil
Objective-C:
目标-C:
UIViewController *masterVC = [self.splitViewController.viewControllers firstObject];
UIViewController *detailVC;
if (self.splitViewController.viewControllers.count > 1) {
detailVC = self.splitViewController.viewControllers[1];
}
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.
该splitViewController
属性通过沿着视图控制器层次结构向上移动并尝试找到调用视图控制器所在的任何拆分视图控制器来工作。如果视图控制器不在拆分视图控制器中,则该属性为nil
。它的工作原理与navigationController
和tabBarController
视图控制器属性相同。
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 中的扩展(或 Objective-C 中的类别)使主视图控制器和细节视图控制器更容易访问UISplitViewController
,如下所示(xx_
如果您使用的是 Objective-C,则将所有's替换为您自己的前缀):
Swift:
迅速:
extension UISplitViewController {
var primaryViewController: UIViewController? {
return self.viewControllers.first
}
var secondaryViewController: UIViewController? {
return self.viewControllers.count > 1 ? self.viewControllers[1] : nil
}
}
Objective-C:
目标-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:
目标-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";
}
回答by user1021430
Create a property in your UISplitViewController subclass:
在 UISplitViewController 子类中创建一个属性:
var _detailViewController: UIViewController? {
get {
if viewControllers.count > 1 {
return viewControllers[1] as? UIViewController
}
return nil
}
}
According to Apple's documentation, this should sometimes return nil, but in my experience, it always returns the detail view controller, regardless of state.
根据 Apple 的文档,这有时应该返回 nil,但根据我的经验,无论状态如何,它始终返回详细视图控制器。
Also, do not call this property "detailViewController" instead of "_detailViewController" - Apple is apparently already using that name under the hood, and it will mess with your UI.
此外,不要将此属性称为“detailViewController”而不是“_detailViewController”——Apple 显然已经在幕后使用该名称,它会干扰您的 UI。
UISplitViewController is really hokey and needs a lot of cleanup and corrected documentation...
UISplitViewController 真的很糟糕,需要大量的清理和更正的文档......