UIViewController 上的自定义属性,如 splitViewController 或 tabBarController
Posted
技术标签:
【中文标题】UIViewController 上的自定义属性,如 splitViewController 或 tabBarController【英文标题】:Custom property on UIViewController like splitViewController or tabBarController 【发布时间】:2013-12-09 11:51:50 【问题描述】:我已经为 UISplitView 无法实现的目的编写了一个自定义的简单拆分视图控制器。
现在我希望它的子视图控制器访问这个自定义拆分视图,就像我们可以直接访问 UISplitView
或 UITabBarController
甚至 UINavigationController
而不管控制器的复杂层次结构如何。
例如,即使我们在UITabBarController
和UINavigationController
中使用UISplitView
作为tabBarController
的视图控制器之一,我们总是通过使用属性splitViewController
、tabBarController
和@987654330 来获得合适的控制器@ 在实际的控制器类上。 [它以某种方式遍历层次结构以获取适当的控制器]。
如何创建这样的属性来访问我的自定义拆分视图控制器。
【问题讨论】:
【参考方案1】:我不确定我是否清楚地理解了这个问题,提前道歉。
CustomUISplitViewController.m:
-(void)showChildViewController:(UIViewController *)controller
controller.customSplitViewController = self;
[self addChildViewController:controller];
//add view of controller, etc.
你可以在UIViewController上写分类:
@property (nonatomic, assign) CustomUISplitViewController *customSplitViewController;
【讨论】:
我从你的代码中得到了这个想法。当自定义 splitViewController 收到它的控制器时,我可以在那里设置属性(如您在此处提到的)。谢谢..(竖起大拇指)【参考方案2】:-
为您希望访问其视图的控制器创建一个对象。
然后在当前视图控制器中添加子视图。
以上是以编程方式实现的两个步骤:
A *a = [[A alloc]init];
[self.view addSubView: a.view];
享受乐趣。这就是我对你问题的理解,如果这不是你需要的,请告诉我,并简要解释问题。
【讨论】:
想要访问 viewController 而不是查看。 如您所见,您可以访问视图控制器,a 是视图控制器本身的实例。【参考方案3】:最好的方法是按照 Apple 的方式访问这些属性。因此,我在 UIViewController
上创建了一个类别,并为其添加了一个只读属性。
然后,我创建了该属性的 getter,在其中递归遍历当前控制器的所有 parentViewController
s 并返回适当的控制器,否则返回 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
【讨论】:
我知道我在某种程度上误解了你的问题,现在我明白了。 嗯,你的回答帮助我开始了:) ;)【参考方案4】:你可以调用现有的方法并检查类,这里是一个例子:
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
【讨论】:
以上是关于UIViewController 上的自定义属性,如 splitViewController 或 tabBarController的主要内容,如果未能解决你的问题,请参考以下文章
访问 UIViewController 中的自定义 UINavigationController 属性和方法