以编程方式实例化自定义视图控制器并通过标签获取子视图

Posted

技术标签:

【中文标题】以编程方式实例化自定义视图控制器并通过标签获取子视图【英文标题】:Programmatically instantiate custom view controller and getting the subviews by tag 【发布时间】:2016-06-08 18:26:30 【问题描述】:

我有三个视图控制器,每个都在同一个自定义视图控制器类下,还有一个页面视图控制器。我希望能够重用这三个视图控制器,但它们的子视图上有不同的内容。但是,当我尝试使用[self.storyboard instantiateViewControllerWithIdentifier:identifier] 从页面视图控制器实例化这些视图控制器之一时,使用一种方法来立即按标签查找子视图,返回的子视图为空。有什么方法可以在以编程方式实例化视图控制器后立即通过标签获取子视图?

【问题讨论】:

【参考方案1】:

视图控制器的视图在即将显示之前不会被创建。调用instantiateViewControllerWithIdentifier:后不会创建它们

您应该将访问视图控制器视图的代码放在viewDidLoadviewWillAppearviewDidAppear 中。

您不应该尝试从外部对象操作视图控制器的视图。这违反了封装原则,这是面向对象设计的重要原则。 (正如您发现的那样,它通常也不起作用。)

如果您需要以编程方式对视图进行处理,您应该向视图控制器添加一个或多个公共方法,并调用这些方法来要求视图控制器对其视图进行调整。

【讨论】:

我尝试将代码放在三个视图方法中,但它只会更改子视图,就像你说的那样,视图即将显示,这不是我想要的,因为我想要信息已经在视野中了。有没有办法在视图显示之前对这些子视图进行调整? viewDidLoad 在视图控制器的视图创建之后但在它们显示之前被调用。这是在视图控制器加载其视图时进行一次性设置的地方。 滚动页面浏览似乎有所不同,因为直到我在使用 viewDidLoad 时完全滑动到视图时,我的子视图才发生变化。我最终使用了我需要的 viewDidLayoutSubviews。感谢您的帮助

以上是关于以编程方式实例化自定义视图控制器并通过标签获取子视图的主要内容,如果未能解决你的问题,请参考以下文章

以编程方式获取视图控制器的实例

使用自定义初始化程序 swift 以编程方式实例化和推送视图控制器

以编程方式创建具有多个标签的 UIView

如何在 ios swift 中以编程方式将情节提要视图控制器加载到标签栏控制器中?

如何以编程方式使用自动布局添加自定义视图

MonoTouch 以编程方式为 ContainerView 实例化 ViewController