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

时间:2013-12-09 11:51:50

标签: ios iphone objective-c uiviewcontroller

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

现在,我希望其子视图控制器能够访问此自定义拆分视图,就像我们可以直接访问UISplitViewUITabBarController甚至UINavigationController一样,无论控制器的复杂层次结构如何。

例如,即使我们在UISplitViewUITabBarController中使用UINavigationController作为tabBarController的视图控制器之一,我们总是通过使用属性{{}来获取适当的控制器1}},splitViewController&实际控制器类上的tabBarController。 [它以某种方式遍历层次结构以获得适当的控制器]。

如何创建此类属性以访问我的自定义拆分视图控制器。

4 个答案:

答案 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)

  1. 创建您希望访问其视图的控制器对象。
  2. 然后在当前视图控制器中添加子视图。
  3. 以上是以编程方式实现的两个步骤:

    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