【问题标题】:Make view controller in run time with xibs使用 xibs 在运行时制作视图控制器
【发布时间】:2017-02-27 09:47:49
【问题描述】:

我想在运行时使用这样的 nib 名称制作视图控制器, 但这正在崩溃。

错误

[setValue:forUndefinedKey:]:这个类不符合 key imageViewApp 的 key value 编码。

let vc = UIViewController(nibName: nibName, bundle: nil)

当我尝试使用这样的静态值时

let vc = MyViewController(nibName: "MyViewController", bundle: nil),它正在工作。

这是 MyViewController 中的 IBOutlet

我用谷歌搜索了它,但没有找到足够的解决方案,请告诉我解决方案。

【问题讨论】:

  • 请说明您的崩溃原因。
  • 我收到此错误“[ setValue:forUndefinedKey:]:此类与键 imageViewApp 的键值编码不兼容。”这是 MyViewController 中的 IBOutlet
  • 实际上您使用的是UIViewController ,但您的班级名称是MyViewController 。这意味着 xcode 需要 UIViewController 类型的对象,但您有 MyViewController 类型的对象。

标签: ios objective-c swift uiviewcontroller xib


【解决方案1】:

您正在初始化 UIViewController 并且 UIViewController 没有 imageViewApp 属性。您需要在定义该属性的位置初始化您自己的子类,就像在第二个示例中所做的那样。

试试这样的:

let vc = MyViewController(nibName: nibName, bundle: nil)

如果您的 nib 文件与您的类同名,则不必指定它:

let vc = MyViewController(nibName: nil, bundle: nil)

【讨论】:

  • 正如我所提到的,它正在工作,但我想让它运行时,以便视图控制器可以是任何类型的。
  • @GopalDevra 也许您正在寻找 NSClassFromString?我不确定你想要达到什么目的。
  • 是的,我的目标是在运行时通过名称获取类(使用 xib),或者使用 xib 文件名。
  • @DrummerB 如果我是对的。他正在尝试从单一方法启动 xib,例如如果他有 5 个 xib,那么他只需将 xib 作为参数发送,然后 xib 将从模型类中初始化。
  • @GopalDevra 你在为 xib 实例化一个模型类吗??
【解决方案2】:

从该视图控制器中删除 imageViewApp 属性 IBOutlet 并给该 ImageView 一个标签并使用该标签访问它。

【讨论】:

  • 你可能是对的,但如果我有超过 20 个属性,那么我需要通过标签访问它们,我认为这看起来没什么用。
  • 是的,它没用,但是因为您需要在运行时创建一个 ViewController,所以没有其他方法可以访问该属性,然后标记,因为无法分配 IBOutlet。
猜你喜欢
  • 2011-11-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多