如何从位于故事板上的视图控制器获取子视图

Posted

技术标签:

【中文标题】如何从位于故事板上的视图控制器获取子视图【英文标题】:How to obtain a subview from a view controller located on storyboard 【发布时间】:2012-08-15 22:38:09 【问题描述】:

我有两个视图控制器,每个都有一个带有标签的 UIView。当我按下按钮时,我想将第一个视图控制器的视图设置为第二个视图。当我这样做时,第二个视图控制器不会加载视图,并且在我的第二个视图上指向我的 UIView 的指针为空,所以我无法在我的第一个视图上做任何事情。我正在做的就是这个,因为我的 secondViewNew 是我的 secondView 的一个属性。这可以在故事板上完成吗?我也试过 [self.storyboard instantiateViewControllerWithIdentifier:@"beaconContentID"] 方法做事。在这个项目中,secondViewNew 也是一个 UIView,我已经导入了所有相关的类。

SecondViewController *secondViewControllerInstance =  [[SecondViewController alloc] init];

UIView *test = secondViewControllerInstance.secondViewNew;

NSLog(@"%@",test);

【问题讨论】:

我还尝试通过插入 [secondViewControllerInstance loadView]; 从我的第一个视图中加载视图 您的 secondViewNew 不会在 alloc/init 之后立即加载。只有在第二个视图控制器上调用 awakeFromNib 方法后才能保证实例化它。我不确定你想要实现什么,但听起来你应该将你的视图与视图控制器分开,如果它不“属于”其中之一。只需继承 UIView 并创建一个关联的 nib。这样,您可以在需要时实例化视图。 是的,这就是我决定要做的,但是如何将 nib 文件与 OBJ-C 文件相关联?我刚刚创建了一个新的 nib 文件,但我无法将文件的所有者与我的任何类相关联。 我会把它写下来作为答案,因为这可能会太长。 【参考方案1】:

您的 secondViewNew 不会在 alloc/init 之后立即加载。

只有在第二个视图控制器上调用 awakeFromNib 方法后才能保证实例化它。

我不确定您想要实现什么,但听起来您应该将您的视图与视图控制器分开,如果它不“属于”其中之一。只需继承 UIView 并创建一个关联的 nib。这样您就可以在需要时实例化视图。

步骤如下:

创建一个新的 UIView 子类,即 CustomView 创建一个新的 nib 文件,即 CustomView.xib 将视图添加到您的 nib 文件并将其自定义类设置为 CustomView,根据需要添加子视图等

最后,在要使用自定义视图的视图控制器中:

CustomView *customView = [[[NSBundle mainBundle] loadNibNamed:@"CustomView" owner:self options:nil] objectAtIndex:0];

【讨论】:

啊,我明白了,这正是我需要的解决方案。混合 nib 和 storyboard 文件不是很好吗?我想将所有图形都保存在一个情节提要中......另外,视图控制器中的视图是否不可能小于 iPhone 的默认尺寸?我基本上尝试让视图控制器包含一个较小的视图,然后加载该自定义视图,但这也是不可能的。 您好,是的,可以将视图调整为您需要的任何大小,但如果它是视图控制器的主视图,则不能。如果您在谈论 customview nib,只需确保禁用任何“模拟指标”项目,即状态栏、导航栏,视图将变得可调整大小。不幸的是,还不能在您的故事板文件中包含该视图(我也希望它可用)。

以上是关于如何从位于故事板上的视图控制器获取子视图的主要内容,如果未能解决你的问题,请参考以下文章

故事板上的侧边栏导航菜单

以编程方式导航到另一个故事板上的导航控制器和标签栏控制器内的视图控制器

故事板上的 Xcode 9 和 9.1 选择的设备会影响部署设备上的视图宽度

iOS - 故事板中的导航控制器

iOS - 我的 iPad 故事板上的详细视图未填充

需要帮助在故事板上的 UIScrollView / UIPageControl 中推送视图