Ios 应用程序中首次使用教程的最佳设计/图案?

Ios 应用程序中首次使用教程的最佳设计/图案?,ios,objective-c,design-patterns,singleton,Ios,Objective C,Design Patterns,Singleton,背景: 我有一个有5个标签的应用程序。当用户第一次导航到每个选项卡时,我想显示一个一次性的“教程”。我打算通过创建一个“TutorialViewController”来实现这一点,它将处理这些“tutorial”视图的显示,并具有下一步/后退等按钮 问题是: 我不确定用于实现是否显示这些屏幕以及实例化“TutorialViewController”以显示这些屏幕的逻辑的最佳模式。目标是有一行代码(一个方法调用),在必要时显示教程。我试图避免5个视图控制器之间的代码重复。问题是在何处/如何实现这一

背景:

我有一个有5个标签的应用程序。当用户第一次导航到每个选项卡时,我想显示一个一次性的“教程”。我打算通过创建一个“TutorialViewController”来实现这一点,它将处理这些“tutorial”视图的显示,并具有下一步/后退等按钮

问题是: 我不确定用于实现是否显示这些屏幕以及实例化“TutorialViewController”以显示这些屏幕的逻辑的最佳模式。目标是有一行代码(一个方法调用),在必要时显示教程。我试图避免5个视图控制器之间的代码重复。问题是在何处/如何实现这一单一方法。作为TutorialViewController上的类方法?作为一个全局C函数

我考虑过的事情:

1) 在TutorialViewController上实现一个名为“DisplayTutorialIf”的类方法。在本例中,每个具有教程的视图控制器都将从其“viewDidAppear”方法调用此类方法。这个类方法将检查教程是否已经显示,如果没有,它将实例化一个TutorialViewController对象来处理以显示它。在这个选项中,我想我必须从每个调用视图控制器传入“self”,类方法将使用它来显示TutorialViewController

2) 在TutorialViewController上实现名为“tutorialshouldbayedforscreen:”的类方法。在这个选项中,每个调用视图控制器的人都会调用这个方法,如果它返回true,每个vc都会实例化并呈现“TutorialViewController”,它将处理显示教程的问题

我确信有一个“最佳实践”或模式适合这个场景,但我不确定最佳实现是什么。提前感谢您的推荐

总而言之:不要在每个视图控制器中都有这样的内容:

 if ([TutorialViewController shouldDisplayTutorialForScreen:<someEnum>])
 {
     TutorialViewController *myTutorialVC = [[TutorialViewController alloc] init];
     [self displayModalViewController: myTutorialVC];
 }
if([TutorialViewController shouldldisplayitutorialforscreen:]
{
TutorialViewController*myTutorialVC=[[TutorialViewController alloc]init];
[自显示ModalViewController:myTutorialVC];
}
我想要更像这样的东西:

 [FirstUseViewController displayTutorialIfNecessaryForScreen: <someEnum> forParentViewController: self];
[FirstUseViewController显示屏幕所需的教程资格:forParentViewController:self];

将教程显示的状态存储到
NSUserDefaults
中,并使用工厂方法设计模式让您需要的每个UIViewController创建并返回教程
UIViewController
,如下所示:

- (UIViewController *)tutorialVC {
   return [[MYHomeScreenTutorialVC alloc] init];
}

我不喜欢直接调用另一个视图控制器类上的代码。因此,我更喜欢2而不是1,但为什么不在
UIViewController
上使用category方法呢?这不是最佳实践,而是一个快速的意见:如果实际的viewcontroller和教程vc之间没有交互,最好不要在实际vc中添加任何代码,而是在处理它们之间导航的容器对象中添加。如果需要任何交互,我只需添加一个协议,其中包含几个选项,如处理教程的开始、结束和特殊阶段。@Marcus Adams--我同意你的意见,但是UIViewController上的类别听起来也不太适合…@a-Live——所以你建议选项卡视图控制器应该处理它?教程视图将在每个视图控制器上以模态方式显示,因此我不确定容器视图控制器是否应在其子对象上显示模态视图控制器……你是说factory方法设计模式?这一总体思路可能可行。如果需要的话,我会退回一个VC,否则为零。。。