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

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

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

例如,即使我们在UITabBarControllerUINavigationController 中使用UISplitView 作为tabBarController 的视图控制器之一,我们总是通过使用属性splitViewControllertabBarController 和@987654330 来获得合适的控制器@ 在实际的控制器类上。 [它以某种方式遍历层次结构以获取适当的控制器]。

如何创建这样的属性来访问我的自定义拆分视图控制器。

【问题讨论】:

    标签: ios iphone objective-c uiviewcontroller


    【解决方案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】:
    1. 为您希望访问其视图的控制器创建一个对象。
    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
    

    【讨论】:

      猜你喜欢
      • 2011-12-18
      • 1970-01-01
      • 1970-01-01
      • 2011-01-14
      • 2014-01-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多