【发布时间】:2015-07-17 18:30:38
【问题描述】:
我有几个视图控制器,它们具有相同的背景图像和一两个按钮。每个控制器的其余内容会有所不同。我想创建BaseViewController,它有.xib 文件,我将在其中设置背景图像、按钮和其他有约束的东西。然后我想创建子控制器(HomeViewController、GameViewController 等),它们只是从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