通过 instantiateViewControllerWithIdentifier 将代码与 Storyboard 中的视图控制器组合

Posted

技术标签:

【中文标题】通过 instantiateViewControllerWithIdentifier 将代码与 Storyboard 中的视图控制器组合【英文标题】:Combine code with view controller in Storyboard via instantiateViewControllerWithIdentifier 【发布时间】:2013-03-05 15:58:04 【问题描述】:

我正在学习 Objective-C,但遇到了一些对我来说没有意义的东西。

当我们在 Storyboard 中绘制了一个视图控制器 (VC) 时,您可以通过在 Storyboard ID 中输入一个字符串来通过代码调用这个 VC(单击 Storyboard 中的 VC,在 Utilities 侧边栏,Identity Inspector 选项卡,Identity 部分)使用 instanceViewControllerWithIdentifier 方法。

在我的示例中,我在 Storyboard 中绘制了一个独立的 UIViewController,并将 Storyboard ID 设置为“orderList”。在代码中,我可以通过这段代码调用这个视图,Code1

UIViewController *ordersVC = [self.storyboard instantiateViewControllerWithIdentifier:@"orderList"];

如果我创建一个名为“SCVCOrders”的 UIViewController 的子类,并在其中插入一些代码来修改它的外观 - 比如设置标题或更改背景颜色,我认为我可以使用此代码 Code2将绘制的VC与SCVCOrders中的代码结合起来:

SCVCOrders *ordersVC = [self.storyboard instantiateViewControllerWithIdentifier:@"orderList"];

但它没有将它们结合起来。它只使用情节提要中绘制的内容。所以接下来,在 Storyboard 中,我将绘制的 VC 的类设置为 SCVCOrders。现在 Code2 给了我组合的外观,但 Code1 也是如此。我由此得出的结论是 Storyboard 优先于实例化代码。 Xcode 不在乎我将视图编码为哪个类,它只会查看 Storyboard 来解决这个问题。这是正确的吗?

我认为能够将我的代码叠加在我在 Storyboard 中绘制的内容之上会很有用。使用我的示例,我想将绘制的 VC 保留为泛型类。并使用 Code2 在绘制的 VC 之上分层代码。或者我们还能如何实现这样的目标?

【问题讨论】:

其实Code1和Code2没有语义上的区别。 【参考方案1】:

instantiateViewControllerWithIdentifier 将返回存储在故事板中的任何类。将此方法返回的类存储在具有不同类类型的指针中不会改变它实际上是什么类型的对象。

也就是说,如果你有一条鱼并称它为老虎,这并不能改变它真的是一条鱼的事实。

【讨论】:

以上是关于通过 instantiateViewControllerWithIdentifier 将代码与 Storyboard 中的视图控制器组合的主要内容,如果未能解决你的问题,请参考以下文章

Swift:prepareForSegue 和 instantiateViewController 之间的区别

Storyboard中ViewController加载的四种方式

Swift 删除对视图控制器的引用

动态呈现 ViewController

导航项未添加

无法关闭 Popover UITableViewController