UIViewControllers的IBOutletCollection

时间:2012-12-05 18:27:11

标签: iphone ios cocoa-touch uiviewcontroller interface-builder

我想做UITabBarController之类的事情。 UITabBarController具有属性viewControllers,我可以在其中添加UIViewController *的实例。我正在尝试用我自己的VC做同样的想法:

@property (nonatomic, copy) IBOutletCollection(UIViewController) NSArray *viewControllers;

但这不起作用。我们甚至可以吗?

编辑1。

Ramshad发布了正确的样本,但使用了XIB。我想用故事板来实现它。

编辑2. - 在赏金结束时......

我对vaderkvarn的帖子提出质疑,因为UITabBarController的情况有效。正如Ramshad所说,在NIB中也是如此。到目前为止,dasblinkenlight的帖子是最正确的,但没有回答这个问题。我打开这个问题因为我们会发现它是否仅限于我们或者是什么方式。

PS:为什么这些downvotes?

3 个答案:

答案 0 :(得分:2)

插座收集解决方案不起作用的原因是View Controller不是插座。来自documentation

  

插座是使用符号IBOutlet和注释的属性   您可以在nib文件或故事板中以图形方式设置其值。

视图控制器不是图形对象。

如果要使用IBOutletCollection,则只应使用一个视图控制器,并将视图放入集合中。

但是如果你想为每个视图设置一个控制器,你需要采用更加程序化的方法。带视图控制器的数组可能是一个好的开始,但我不能说因为我不知道你想用它们做什么。

修改

更清楚,因为你似乎没有理解我的观点:

不,它不一定是一种方式。 Storyboard不是API,它是用于绘制场景和segue的图形工具。它专为基于Tab Bar的应用程序而设计。

如果您右键单击Storyboard文件并选择打开为 - >源代码,您将看到标签栏控制器具有其他视图控制器所没有的特殊元素。在Storyboard文件中乱用XML不仅仅是我。

如果您想使用Nib文件,请使用Ramshads答案。

如果您希望尽可能接近故事板,请使用dasblinkenlights答案。

但是你的问题(据我所知)的答案是否定的,没有办法用故事板来完成这个。如果是的话,它将被记录,但事实并非如此。

答案 1 :(得分:2)

虽然看起来不能将UIViewController连接到IBOutletCollection(或者使用它们的限制太多),但有一个简单的解决方案可以在使用故事板时起作用。此代码会进入您的viewDidLoad方法:

_viewControllers = [NSArray arrayWithObjects: 
,   [self.storyboard instantiateViewControllerWithIdentifier:@"Controller1"]
,   [self.storyboard instantiateViewControllerWithIdentifier:@"Controller2"]
,   [self.storyboard instantiateViewControllerWithIdentifier:@"Controller3"]
,   nil];

答案 2 :(得分:1)

我已使用 UISegmentedControl + IBOutletCollection + presentViewController 完成了您的要求。

您可以使用任何控件代替 UISegmentedControl

我已向 UIViewControllers 添加了3个不同的 Xib ,并标记为 ViewController1,2,3.

我还添加了2个额外的方法。一个用于显示相应的视图,另一个用于解除先前填充的视图。

我已附上 Xib 设置屏幕截图。

您只能使用一个 UIViewController 而不是3,并将其重复用于某些逻辑:)

方法如下:

@property (strong, nonatomic) IBOutletCollection(UIViewController) NSArray *ViewCollection;

//dismissing the earlier populated view
- (IBAction)dismiss:(id)sender {

    [self dismissViewControllerAnimated:YES completion:nil];
}


//presenting the corresponding view.
- (IBAction)resetAction:(id)sender {      

    UISegmentedControl *mySegment = (UISegmentedControl *)sender;

    int index = 0;          
    for (UIViewController *viewItem in _ViewCollection) {

        if (index == mySegment.selectedSegmentIndex) {

            [self presentViewController:viewItem animated:YES completion:nil];
        }
        index++;
    }
}

您可以从here

下载我的示例应用程序

Xib设置屏幕截图

enter image description here