在XIB中连接UIView并使用Story板中的View Controller加载它

时间:2014-07-14 15:44:12

标签: ios objective-c uiview uiviewcontroller

我有一个XYZViewController(故事板中的简单UIViewController),它加载了默认视图。我有一个XYZView类型,我在UIView文件中有.xib

在XYZViewController类中,我将XYZView的属性定义为IBOutlet。棘手的是我不知道如何将这个属性连接到storyboard(或.xib文件中的UIVIew)中的UIViewController,以便 -

  • IBOutlet连接到右侧UIView
  • xib中的视图成为UIViewController默认视图的附加子视图。

(我的问题听起来很狡猾和/或我可能没有正确的方法来解释它,但这是我能做到的最好的。)

编辑:进一步澄清可能会更容易。我只是不想自己说:

XYZView *xyzView = [[XYZView alloc] initWithFrame...]; 

[self.view addSubview:xyzView];

也许这有帮助。

1 个答案:

答案 0 :(得分:4)

好的,从我告诉你的内容来看......

<强> XYZViewController 代码在XYZViewController.h and .m个文件中。

.storyboard文件 在storyboard文件中,您有一个视图控制器,您已将子类设置为XYZViewController

.xib文件 在xib文件中,您有一个已定义为子类XYZView的视图。

右?

我猜你所做的是以下......

在.xib文件中,您已列出XYZView并在其上放置标签,按钮等。

视图控制器由故事板创建。但是现在你要将标签和按钮附加到它上面。

右?

如果这一切都是正确的,那么你有几个选择。

最简单的选项

删除xib文件。除非在应用程序的多个位置使用XYZView(即在不同的视图控制器内),否则您应该在故事板中完成所有这些布局。将按钮和标签添加到故事板中的XYZViewController

这将允许您连接IBOutlets和IBActions,它将全部正常工作,因为故事板正在创建,然后设置插座和操作。

下一个选项

因为您已在xib文件中创建了视图,所以必须从代码中的xib文件加载它,然后将其添加到视图控制器。

像...一样的东西。

- (void)viewDidLoad
{
    [super viewDidLoad];

    self.xyzView = [[[NSBundle mainBundle] loadNibNamed:@"XYZView" owner:self options:nil] objectAtIndex:0];

    [self.view addSubview:xyzView];
}

然后你可以做像...这样的事情。

self.xyzView.someLabel.text = @"This is the text";

您仍然无法连接插座和操作,但这是因为视图控制器不是由xib创建的。它是由故事板创建的。

这可能会让一切变得混乱。我真的只建议在单独的xib中创建一个视图,如果它是你反复使用的东西(比如5星评级视图或其他东西)。

你绝对不能做什么

好吧,我想我可能已经想到你在做什么。

在故事板中,您已将视图的子类设置为XYZView,并且您希望它能够获取您在xib文件中为XYZView定义的标签和按钮等...

这绝对不会奏效。

故事板和xib是完全独立的对象。如果要一起使用它们,则代码涉及从笔尖加载视图,然后将其添加到在故事板中创建的视图控制器。