0

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

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

但这不起作用。对我们来说甚至可能吗?

编辑 1。

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

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

我质疑 vaderkvarn 的帖子,因为如果UITabBarController它有效。同样正如 Ramshad 发布的那样,在 NIB 中是可能的。到目前为止,dasblinkenlight 的帖子是最正确的,但没有回答问题。我保留这个问题是因为我们将找出它是否对我们有限制或有什么方法。

PS:为什么会有这些反对票?

4

3 回答 3

2

出口收集方案不起作用的原因是视图控制器不是出口。从文档中:

出口是用符号 IBOutlet 注释的属性,您可以在 nib 文件或情节提要中以图形方式设置其值。

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

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

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

编辑:

为了更清楚,因为你似乎没有明白我的意思:

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

如果您右键单击 Storyboard 文件并选择open as -> Source Code,您将看到 Tab Bar Controller 具有其他 View Controller 所没有的特殊元素。在 Storyboard 文件中弄乱 XML 超出了我的范围。

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

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

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

于 2012-12-09T14:18:46.293 回答
2

尽管看起来您不能将UIViewControllers 连接到IBOutletCollections(或者使用它们时有太多限制),但是当您使用情节提要时,有一个简单的解决方案可以工作。此代码进入您的viewDidLoad方法:

_viewControllers = [NSArray arrayWithObjects: 
,   [self.storyboard instantiateViewControllerWithIdentifier:@"Controller1"]
,   [self.storyboard instantiateViewControllerWithIdentifier:@"Controller2"]
,   [self.storyboard instantiateViewControllerWithIdentifier:@"Controller3"]
,   nil];
于 2012-12-11T17:17:27.260 回答
1

我已经使用 UISegmentedControl + IBOutletCollection + presentViewController.

您可以使用任何控件代替UISegmentedControl您的意愿。

我添加了 3 个不同UIViewControllersXib标记为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++;
    }
}

您可以从这里下载我的示例应用程序

Xib 设置截图

在此处输入图像描述

于 2012-12-10T10:03:49.470 回答