【问题标题】:iOS - is it possible to inherit view controller with xib file? and how?iOS - 是否可以使用 xib 文件继承视图控制器?如何?
【发布时间】:2015-07-17 18:30:38
【问题描述】:

我有几个视图控制器,它们具有相同的背景图像和一两个按钮。每个控制器的其余内容会有所不同。我想创建BaseViewController,它有.xib 文件,我将在其中设置背景图像、按钮和其他有约束的东西。然后我想创建子控制器(HomeViewControllerGameViewController 等),它们只是从BaseViewController 继承并在 Interface Builder 中设置所有东西。可能吗?子控制器会在 Storyboard 中设置自己的东西吗?在 .xib 中为超类设置背景图像,在 Storyboard 中为子类设置 tableView。我知道我可以在代码中设置所有内容,但是.xib 和 IB 可以吗?

我正在考虑使用 Container 视图,但我可能想更改 BaseViewController 并创建更多超级控制器,所以我认为如果有可能,使用继承会更容易。

编辑:

iphonic 建议的可能方式。它基于两个控制器,它们共同使其他控制器成为子类。 BaseGameDesignViewController 有 .xib 文件,控制器中除了默认之外没有更多代码。下面的代码来自继承其他控制器的 BaseGameViewController。这与展开 segue 有问题,向下滚动时会出现白屏。

override func viewDidLoad() {
    super.viewDidLoad()

    var viewController = BaseGameDesignViewController(nibName: "BaseGameDesignViewController", bundle: nil) as BaseGameDesignViewController
    contentView = viewController.view
    viewController.homeButton.addTarget(self, action: "homeButtonTapped:", forControlEvents: .TouchUpInside)
    self.view.insertSubview(contentView, atIndex: 0)
}

override func viewDidLayoutSubviews() {
    super.viewDidLayoutSubviews()

    contentView.frame = self.view.frame
}


func homeButtonTapped(sender: AnyObject) {
    self.performSegueWithIdentifier("backToMainSegue", sender: self)
}

【问题讨论】:

  • 是的,但是那个 xib 应该是与其他控制器不同的 xib,比如 BaseDesignController,在 BaseViewController、viewDidLoad 方法上,您加载 BaseDesignController 并添加为子视图..
  • 我先试试你的 iphonic 方式,因为它几乎就是我想要的。我编辑了我的问题。它正在工作,但我对此有疑问。当我通过 unwind segue 返回时,隐藏的控制器屏幕是白色的。我猜是因为这个小技巧。有办法解决吗?
  • 我的答案有一个问题——当你唯一使用的是视图时,为什么要有一个控制器 xib?只需创建一个包含视图而不是控制器的 xib!
  • 你完全正确。当我这样做时,我可以将其更改为仅使用自定义视图而不是控制器,所以我这样做了。但是当我使用 unwind segue 时,仍然有白屏而不是背景。是因为视图是由 insertSubview 添加的,并且不在 Storyboard 中吗?我该如何解决?
  • @LiborZapletal 你得到白屏,可能是因为你没有设置自动布局约束到 contentView 相对于 parentview。

标签: ios swift inheritance interface-builder xib


【解决方案1】:

不,不能使用 .xib 文件继承视图控制器。 但是,您可以使用 Container View 为所谓的子视图重用子视图。您必须在容器视图中创建用于不同视图控制器的通用子视图。Click here

【讨论】:

    【解决方案2】:

    这是不可能的。

    您可以实现的最佳解决方案是基于:

    1. 容器视图

      • 拥有一个专用视图 XIB,然后将其包含在每个控制器中
    2. 在超类中定义的 Outlets,但在 Interface Builder 中复制粘贴所有内容。

      • 您可以避免代码重复,但无法避免 IB 中的重复。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-26
      • 2021-09-30
      • 1970-01-01
      • 2012-08-25
      • 1970-01-01
      • 2011-07-11
      相关资源
      最近更新 更多