我处于我的应用程序的一个视图控制器变得非常大的情况下,特别是因为我添加了一个“教程状态”,它为我通过检查控制的此类的许多方法添加了不同的实现
_tutorialEnabled?
所以,我的问题是,如果这是一个很好的方法调配用例,我可以将这些方法的不同实现放在一个单独的类别中,并在需要时调配它们,这可能有助于我减少默认实现的代码量。对其他技术的任何意见或建议表示赞赏。
我处于我的应用程序的一个视图控制器变得非常大的情况下,特别是因为我添加了一个“教程状态”,它为我通过检查控制的此类的许多方法添加了不同的实现
_tutorialEnabled?
所以,我的问题是,如果这是一个很好的方法调配用例,我可以将这些方法的不同实现放在一个单独的类别中,并在需要时调配它们,这可能有助于我减少默认实现的代码量。对其他技术的任何意见或建议表示赞赏。
不,这不是 swizzling 的设计目的。
我个人会创建一个管理教程相关内容的视图控制器的子类。然后,根据是否启用教程,实例化教程控制器或其超类。这就是多态性的设计目的:避免无穷无尽的// if
es 。else
switch
你为什么不子类?使用所有需要的逻辑创建视图控制器的教程子类。-viewDidAppear:
使用没有动画的全屏模式在真实视图控制器中展示教程。当教程结束时关闭没有动画的模型。
if _tutorialEnabled != nil && _tutorialEnabled {
tutorialViewController = …
tutorialViewController.modalPresentationStyle = .FullScreen
presentViewController(tutorialViewController, animated: NO) {}
}
不,我不会为此使用方法调配。这有点像用大锤敲入图钉。
与其他人不同,我也不会子类化视图控制器,当您想稍后添加其他功能时,围绕视图生命周期事件维护可理解的流程非常重要。
相反,我会为此使用策略模式。在您的初始化中,您可以执行以下操作:
if (tutorialEnabled) {
self.behaviour = [TutorialBehaviour new];
} else {
self.behaviour = [NormalBehaviour new];
}
然后,当您需要做一些改变时,您只需调用您的行为的方法,例如。
- (void)viewDidLoad
{
...
[self.behaviour load]
...
}