【问题标题】:Interface Builder. How do I Replace Programatic ViewControllers with IB ViewControllers?界面生成器。如何用 IB ViewController 替换 Programmatic View Controller?
【发布时间】:2010-12-08 18:42:46
【问题描述】:

随着我将越来越多的 UI 构建从 XCode 转移到 IB,我还需要清除一个障碍。

目前,我使用自定义初始化程序在 XCode 中创建自定义视图控制器。它们通常有一堆在初始化期间通过传递的参数设置的 ivars。我真的很想尽可能多地把它转移到 IB。

有人可以仔细向我解释 - 或者,更好的是,指向我的代码 - 如何复制通过 IB 中的自定义初始化程序传递参数的 XCode 方法 - 大概是通过 IBOutlet。

提前致谢。

干杯, 道格

更新:

一个典型的场景是我的 AppDelegate 会去网络,获取一些数据 - NSMutableData,然后传递一个对根 viewController 的引用 - 通常是一个 TableViewController - 它被推送到 navigationController 的 viewController 堆栈上。

当一个单元格被选中时,一个 secondViewController 被分配/初始化并且数据的一个子集被传递给它。 secondViewController 去网络获取更多数据,构建视图层次结构,将检索到的数据的位传递给每个子视图,然后每个子视图通过 setNeedsDisplay 发送消息以处理数据。

我想将这种分层数据传递给 IB 是可能的。

【问题讨论】:

  • ivars都是NSControl的子类吗?或者它们是来自您应用中其他地方的其他数据?
  • 据我所知,您在更新中描述的内容在 IB 中是不可能的。
  • 我主要处理 NSMutableData、NSMutableString 和 NSMutableArray。不是 NSControl 子类的容器和字符串。我是否应该从您的评论中推断非 NSControl 子类不能是 IBOutlets?

标签: iphone xcode uiviewcontroller interface-builder


【解决方案1】:

您仍然可以使用自定义初始化程序。然而,在这个初始化的内部你会调用-[initWithNibName:@"yourNibName" bundle:bundle]。您将在 Interface builder 中连接与 UIKit 相关的实例变量(UILabelUIButton 等),因此不必在初始化程序中实例化这些对象。您将在初始化程序中实例化和设置的其他实例变量(字符串、字典、自定义对象等)。

另外,请记住,操作 UIKit 相关变量(例如设置标签文本或设置 UIView 的位置)应在 viewDidLoad 方法中完成,因为这些对象可能尚未完全在初始化程序执行时创建。

如果您需要更多信息,请告诉我。

【讨论】:

  • 谢谢贾斯廷。是的,这几乎就是我一直在使用的方法。我希望有一种方法可以重构我正在使用非 UIKit ivars 进行的设置 - NSMutableData、NSMutableArray 等 - 在 vi​​ewDidLoad 到 IB 中。听起来这是不可能的。
  • 没问题。为了清楚起见,您可能希望在自定义初始化程序而不是 viewDidLoad 中对这些变量进行初始化。
  • 只是,其实我倾向于做的是等到 viewDidAppear:。我所做的是在我从网络异步获取数据时显示一个微调器,在返回时稍微烹制数据,将烹制的数据交给我的子视图,在我的子视图上调用 setNeedsDisplay,然后关闭微调器。
  • 这对于从网络中提取的数据来说绝对有意义。
【解决方案2】:

假设我们有 MyViewController 扩展 UIViewController 和 MyViewControllerParameter 这是我们在初始化时传递给 MyViewController 的自定义对象之一。 MyViewController 在其中定义了一个 MyViewControllerParameter 类型的 IBOutlets。我们想把 MyViewController 放到另一个包含视图 ParentView.xib 中。 ParentView.xib 由 ParentViewController.m 所有并在其他地方创建。我们在 XCode 中双击 ParentView.xib 来启动 Interface Builder。然后,我们将“对象”从库视图(如果默认情况下未打开,我相信您可以使用 Cmd+Shift+L 打开库视图)拖到文档窗口中。 (这是Cmd+0激活的窗口。)

“对象”是库中的任意小部件(由实心金色立方体图标标识),可以代表项目中的任何内容。将新对象放入文档窗口后,我们键入 Cmd+4 打开 Indentity Inspector 窗口。在顶部文本字段中,我们可以输入视图控制器参数的名称“MyViewControllerParameter”。接下来,我们在库中找到 ViewController 小部件并将其放入文档窗口。我们打开属性检查器 (Cmd+1) 并将 nib 名称设置为“MyView.xib”。这应该会导致 CocoaTouch 使用“MyView.xib”中的定义加载 MyViewController。

打开身份检查器并将类属性设置为 MyViewController。最后,我们在文档窗口中右键单击或控制单击(如果我们在 MacbookPro 上正确配置了触控板,则用两根手指点击)MyViewController。这将打开一个窗口,显示 MyViewController 中的所有 IBOutlets。从 MyViewControllerParameter 插座旁边的小圆圈中拖出一条线,并将其放在文档窗口中的 MyViewControllerParameter 对象上。连接这些点是您使用界面构建器在对象之间设置参数的方式。

【讨论】:

  • 稍微格式化一下(例如,一两行换行符),确实会让你的答案很多更容易阅读。
  • 谢谢克里夫。但是,正如我开始意识到的那样,IBOutlets 只能与 NSControl 子类一起使用。我主要处理 NSMutableData、NSMutableString 和 NSMutableArray。容器和字符串。这些不是 NSControl 子类。
  • 这对我来说是个新闻。我认为您可以将任何对象插入到 IBOutlet 中,只要它在 xib 文件中可用。但是,我可能是错的。
猜你喜欢
  • 2014-07-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-21
  • 2010-11-09
相关资源
最近更新 更多