我编写了一个自定义的简单拆分视图控制器,用于UISplitView无法实现的目的。
现在,我希望其子视图控制器能够访问此自定义拆分视图,就像我们可以直接访问UISplitView
或UITabBarController
甚至UINavigationController
一样,无论控制器的复杂层次结构如何。
例如,即使我们在UISplitView
和UITabBarController
中使用UINavigationController
作为tabBarController
的视图控制器之一,我们总是通过使用属性{{}来获取适当的控制器1}},splitViewController
&实际控制器类上的tabBarController
。 [它以某种方式遍历层次结构以获得适当的控制器]。
如何创建此类属性以访问我的自定义拆分视图控制器。
答案 0 :(得分:1)
我不确定我是否清楚地理解了这个问题,提前道歉。
<强> CustomUISplitViewController.m:强>
-(void)showChildViewController:(UIViewController *)controller{
controller.customSplitViewController = self;
[self addChildViewController:controller];
//add view of controller, etc.
}
您可以在 UIViewController :
上编写类别@property (nonatomic, assign) CustomUISplitViewController *customSplitViewController;
答案 1 :(得分:0)
以上是以编程方式实现的两个步骤:
A *a = [[A alloc]init];
[self.view addSubView: a.view];
享受乐趣。这就是我理解你的问题,如果这不是你需要的,请告诉我,并简要解释一下问题。
答案 2 :(得分:0)
最好的方法是遵循Apple访问这些属性的方式。因此,我在UIViewController
上创建了一个类别,并为其添加了只读属性。
然后,我创建了这个属性的getter,我在其中递归遍历当前控制器的所有parentViewController
并返回相应的控制器,否则返回nil。
@class CZSplitViewController;
@interface UIViewController (CZSplitViewContrller)
// Do not assign to this property
@property (nonatomic, readonly) CZSplitViewController *czSplitViewController;
@end
@implementation UIViewController(CZSplitViewContrller)
- (CZSplitViewController *)czSplitViewController
{
return (CZSplitViewController *)[self recursivelyTraverseControllerParents:self];
}
- (UIViewController*) recursivelyTraverseControllerParents:(UIViewController*)controller
{
if (!controller) return nil;
if ([controller isKindOfClass:CZSplitViewController.class])
{
return controller;
}
return [self recursivelyTraverseControllerParents:controller.parentViewController];
}
@end
答案 3 :(得分:0)
您可以调用现有方法并检查类,下面是一个示例:
SceneSplitViewController.h
@interface SceneSplitViewController : UISplitViewController
@end
@interface UIViewController (SceneSplitViewController)
@property(strong, nonatomic, readonly) SceneSplitViewController *sceneSplitViewController;
@end
SceneSplitViewController.m
#import "SceneSplitViewController.h"
@implementation SceneSplitViewController
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view.
}
@end
@implementation UIViewController (SceneSplitViewController)
- (SceneSplitViewController *)sceneSplitViewController{
UISplitViewController *svc = self.splitViewController;
if([svc isKindOfClass:SceneSplitViewController.class]){
return (SceneSplitViewController *)svc;
}
return svc.sceneSplitViewController;
}
@end