创建一个RootViewController以继承所有其他VC是一个好习惯吗?

时间:2017-01-21 15:00:57

标签: ios inheritance controller viewcontroller

这看起来可能是一个愚蠢的问题(对不起,如果是),但通常,在我的应用程序中,我有这个rootVC继承其他VC。所以来找我,我有这个根的倍数实例。例如,在AppDelegate中,我将第一个视图称为:

let window = UIWindow(frame: UIScreen.main.bounds)
let root = SplashViewController(nibName: "SplashViewController", bundle: nil)
window.rootViewController = UINavigationController(rootViewController: root)
window.makeKeyAndVisible()

self.window = window

然后SplashViewController继承自RootViewController,我可以在其中进行一些视图配置。但是,当我调用另一个也从我的root继承的VC(如InitialViewController)时,我是从我的root创建新实例还是使用相同的? 你认为这是一个好习惯吗?

我正在阅读和搜索,但我无法在api参考中找到或理解:https://developer.apple.com/reference/uikit/uiviewcontroller

有什么建议吗?提前谢谢!

2 个答案:

答案 0 :(得分:1)

为所有视图控制器设置一个公共子类可能很有用,但尽量不要给它带来太多负担。在可能和合理的情况下考虑使用组合而不是继承(Prefer composition over inheritance?)。

  

然后SplashViewController继承自RootViewController,我可以在其中进行一些视图配置。但是,当我调用另一个也从我的root继承的VC(如InitialViewController)时,我是从我的root创建新实例还是使用它?

不要担心。如果您不在全局范围内使用静态变量或变量,那么视图控制器的每个实例都将是独立的。

答案 1 :(得分:1)

这是一个落入anti patterns of OOPS的例子。在Swift中,您可以使用协议来解决这个问题。

说,你有一个可以继承的公共类,如果某些类需要一个特殊的功能,其他人不会这样做怎么办?如果你选择在公共超类中添加它,你倾向于膨胀继承超类的所有其他子类。如果您不这样做,则可能需要复制代码。

你可以使用协议优雅地解决问题,我想你会这样做,

protocol CommonTraits { }
extension CommonTraits { // provide default implementations of common methods }

protocol SpecialSetOfTraits { }
extension SpecialSetOfTraits {  // provide default implementations of common methods  }

Class A : CommonTraits {} // less bloating 
Class B : CommonTraits, SpecialSetOfTraits { } // Additional functionality. 

这就是我爱斯威夫特的原因:)。

相关问题