UIViewController 上的自定义属性,如 splitViewController 或 tabBarController

Posted

技术标签:

【中文标题】UIViewController 上的自定义属性,如 splitViewController 或 tabBarController【英文标题】:Custom property on UIViewController like splitViewController or tabBarController 【发布时间】:2013-12-09 11:51:50 【问题描述】:

我已经为 UISplitView 无法实现的目的编写了一个自定义的简单拆分视图控制器。

现在我希望它的子视图控制器访问这个自定义拆分视图,就像我们可以直接访问 UISplitViewUITabBarController 甚至 UINavigationController 而不管控制器的复杂层次结构如何。

例如,即使我们在UITabBarControllerUINavigationController 中使用UISplitView 作为tabBarController 的视图控制器之一,我们总是通过使用属性splitViewControllertabBarController 和@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,在其中递归遍历当前控制器的所有 parentViewControllers 并返回适当的控制器,否则返回 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 属性和方法

属性上的自定义属性 - 获取属性属性的类型和值

从 UIViewController 中删除我的自定义 MKMapView

推送 UIViewController 的自定义导航栏

带有旋转的自定义 UIViewController 过渡

如何让 UITableView 继承 UIViewController 的自定义子类?