【问题标题】:Multiple View Controllers and one view nib多个视图控制器和一个视图笔尖
【发布时间】:2014-07-02 17:02:09
【问题描述】:

我想实现以下目标:

我有一个 nib,它有一个负责该视图的视图控制器。

我想编写继承自该视图控制器的类,因此与基本视图控制器共享相同的 nib 文件,但添加了额外的特定代码。我可以在基本视图控制器中构建很多功能,但它会变得一团糟;我真的希望能够用一个笔尖拥有相同的基本结构,然后拥有添加附加功能的子类。

我遇到的麻烦是使用基类的视图实例化(在代码中)子类。

我已经尝试过 [NSBundle nibWithNibName:...] 和 [[vc alloc] initWithNib:...] - 他们都给出了错误。

我是否将文件的所有者设置为基类?我是否为基类设置视图的自定义视图控制器?我如何做到这一点?

谢谢

【问题讨论】:

  • 你从[[vc alloc] initWithNibName:...]得到什么错误?
  • [UIViewController _loadViewFromNibNamed:bundle:] 加载了“APDayView”笔尖,但未设置视图出口。在我的基类的笔尖中,我将自定义视图控制器类设置为我的基类的类型。我将 File's Owner 留为空白 - 这是我通常将类与 nib 关联的方法。
  • 如果我设置文件的所有者,我会收到错误消息,说我已将我的视图与两个视图控制器(自定义类视图控制器和文件的所有者)关联,然后如果我随后离开“自定义类” vc'框空白并仅设置文件的所有者,我收到错误消息说'[UIViewController..不符合[outlets]的键编码'即。它认为该类是一个通用视图控制器并且不实例化文件的所有者

标签: ios uiviewcontroller uikit


【解决方案1】:

要设置从视图控制器到视图或子视图的出口,您必须将 nib 中的文件所有者设置为视图控制器的类。

实际 视图控制器可以是在 nib 中声明为文件所有者的类的子类。但是 outlets 必须仍然在超类中,否则您将无法使用 other 子类进行加载。

例如,让我将视图控制器称为 SuperVC、Sub1VC 和 Sub2VC。那么:

  • 在 SuperVC 中定义所有需要的 outlet

  • 在 nib 中将文件的所有者声明为 SuperVC

  • 在笔尖上画出所有的插座连接,当然包括view

现在说:

Sub1VC* vc = [[Sub1VC alloc] initWithNibName:@"nibname" bundle:nil];

或者:

Sub2VC* vc = [[Sub2VC alloc] initWithNibName:@"nibname" bundle:nil];

它们都可以工作。

【讨论】:

  • 如果您想了解 为什么 有效,请参阅我对笔尖加载机制的讨论,从这里开始:apeth.com/iOSBook/ch07.html#_nib_loading_and_file_8217_s_owner
  • 如果类不是视图控制器,有没有办法做到这一点?我希望对直接位于 nib 中且看不到视图控制器的视图执行此操作(尽管我认为我必须更改此设置)。谢谢马特!
  • @Yar 当然。这与视图控制器无关。你有没有看过我在评论中链接到的书中的讨论?
  • 是的,我还在寻找。但是,我还不明白如何将 File Owner 更改为 be NSView 子类允许我更改我在 nib 中使用的 NSView 子类实例的类。当然,我会继续看你的章节并尝试一些事情
  • “但是,我还不明白如何将文件所有者更改为 NSView 子类” 文件的所有者不应该是 NSView 子类。它应该是当您加载 nib 时将成为 owner 的对象的类。或者您可以使用 no 所有者加载 nib,然后抓取最上面的对象(视图)。
【解决方案2】:

听起来你需要设置视图出口。

这是一个非常常见的错误。只需 control + drag 从 File's Owner(基本视图控制器)到顶层视图,并设置 view 的出口。

【讨论】:

  • 如果我设置文件的所有者,我会收到错误消息,说我已将我的视图与两个视图控制器(自定义类视图控制器和文件的所有者)关联,然后如果我随后离开“自定义类” vc'框空白并仅设置文件的所有者,我收到错误消息说'[UIViewController..不符合[outlets]的键编码'即。它认为该类是一个通用视图控制器并且不实例化文件的所有者类
猜你喜欢
  • 2012-12-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-06
  • 1970-01-01
相关资源
最近更新 更多