方法Swizzling以保持更清晰的类实现

时间:2015-06-12 09:41:04

标签: ios method-swizzling

我遇到的情况是我的应用程序的一个viewControllers变得非常大,特别是因为我添加了一个“Tutorial state”,它通过检查<我控制的这个类的许多方法添加了不同的实现/ p>

_tutorialEnabled?

所以,我的问题是,如果这是方法调配的一个很好的用例,我可以将这些方法的不同实现放在一个单独的类别中,并在需要时调用它们,它可能会帮助我减少默认代码的数量实现。欢迎任何其他技术的意见或建议。

3 个答案:

答案 0 :(得分:1)

不,这不是针对什么方法设计的。

就个人而言,我会创建一个视图控制器的子类来管理教程相关的东西。然后,根据是否启用了教程,您可以实例化教程控制器或其超类。这就是多态性的设计目的:避免无休止的if / else / switch es。

答案 1 :(得分:1)

为什么不进行子类化?使用所有需要的逻辑创建视图控制器的教程子类。使用不带动画的全屏模式在真实视图控制器的-viewDidAppear:中演示教程。当教程结束时,在没有动画的情况下关闭模型。

if _tutorialEnabled != nil && _tutorialEnabled {
    tutorialViewController = …
    tutorialViewController.modalPresentationStyle = .FullScreen
    presentViewController(tutorialViewController, animated: NO) {}
}

答案 2 :(得分:0)

不,我不会为此使用方法调整。这有点像用大锤敲打图钉。

与其他人不同,我也不会将视图控制器子类化,如果您希望稍后添加其他功能,那么维护视图生命周期事件周围的可理解流程非常重要。

相反,我会使用strategy pattern。在你的init中你可以这样做:

if (tutorialEnabled) {
    self.behaviour = [TutorialBehaviour new];
} else {
    self.behaviour = [NormalBehaviour new];
}

然后,当你需要做一些改变的事情时,你只需要对你的行为调用一个方法,例如

- (void)viewDidLoad
{
    ...
    [self.behaviour load]
    ...
}