2013-09-25 1 views
2

배경 :앱에서 처음 사용하는 자습서에 가장 적합한 디자인/패턴?

5 개의 탭이있는 앱이 있습니다. 처음 사용자가 각 탭을 탐색 할 때 한 번만 "자습서"를 보여 드리고자합니다. 이러한 "튜토리얼"보기 표시를 처리하고 다음/뒤로 등에 대한 버튼이있는 "TutorialViewController"를 작성하여이 작업을 수행하려고합니다.

문제점 : 사용하기 가장 좋은 패턴이 확실하지 않습니다. 이 화면을 표시할지 여부와 TutorialViewController를 인스턴스화하여 표시 할 지 여부를 결정하는 논리를 구현합니다. 목표는 필요에 따라 자습서를 표시하는 단일 코드 행 (단일 메소드 호출)을 갖는 것입니다. 5 개의 뷰 컨트롤러에서 코드 중복을 피하려고합니다. 문제는이 단일 메서드를 구현하는 위치/방법입니다. TutorialViewController 클래스 메서드로? 글로벌 C 함수로서?

상황이 내가 생각했습니다 TutorialViewController에 클래스 메소드를 구현

1) "displayTutorialIfNecessary"를 불렀다. 이 경우 자습서가있는 각보기 컨트롤러는 "viewDidAppear"메서드에서이 클래스 메서드를 호출합니다. 이 클래스 메쏘드는 튜토리얼이 이미 보여 졌는지를 검사 할 것이고 그렇지 않다면 TutorialViewController 객체를 인스턴스화하여 그것을 표시하기 위해 처리 할 것이다. 이 옵션에서는 각 호출 뷰 컨트롤러에서 "self"를 전달해야하고 클래스 메서드는이를 사용하여 TutorialViewController를 표시합니다.

2) TutorialViewController에서 "tutorialShouldBeDisplayedForScreen :"이라는 클래스 메소드를 구현합니다. 이 옵션에서 각 호출 뷰 컨트롤러는이 메소드를 호출하고 true를 반환하면 각 VC는 인스턴스를 표시하고 튜토리얼 표시를 처리하는 "TutorialViewController"를 표시합니다.

이 시나리오에 맞는 "모범 사례"또는 패턴이 있지만 확실한 구현 방법이 무엇인지 확신 할 수 없습니다. 귀하의 권장 사항에 미리 감사드립니다.

은 요약하면 :

[FirstUseViewController displayTutorialIfNecessaryForScreen: <someEnum> forParentViewController: self]; 
+0

다른보기 컨트롤러 클래스에서 코드를 직접 호출하는 것을 좋아하지 않습니다. 그래서, 나는 2보다 1을 선호하지만, 왜 'UIViewController'에 카테고리 메소드를 사용하지 않을까요? –

+0

모범 사례는 아니지만 빠른 견해 : 실제 뷰 컨트롤러와 튜토리얼 vc 사이에 상호 작용이 없다면 실제 VC에 코드를 추가하지 말고 대신에 탐색을 처리하는 컨테이너 객체에서 코드를 추가하는 것이 좋습니다. 상호 작용이 필요한 경우 튜토리얼의 시작, 끝 및 특수 단계를 처리하는 것과 같은 여러 옵션이있는 프로토콜을 추가하기 만하면됩니다. –

+0

@Marcus Adams - 귀하의 의견에 동의하지만 UIViewController의 범주는 그 중 하나와 같은 것이 아닙니다. – HackyStack

답변

1

저장 자습서 NSUserDefaults에 상태를 표시하고 :

if ([TutorialViewController shouldDisplayTutorialForScreen:<someEnum>]) 
{ 
    TutorialViewController *myTutorialVC = [[TutorialViewController alloc] init]; 
    [self displayModalViewController: myTutorialVC]; 
} 

좀 더 이런 일을하고 싶습니다 대신 각 뷰 컨트롤러에서 이런 일이있는의 팩토리 메서드 디자인 패턴을 사용하여 각 UIViewController를 만들고 자습서 UIViewController을 다음과 같이 반환해야합니다.

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

팩토리 메서드 디자인 패턴을 의미합니까? – HackyStack

+0

이 일반적인 아이디어가 효과적 일 것입니다. 만약 VC가 필요하다면 VC를 돌려 주겠다. 그렇지 않다면 .... – HackyStack

+0

네. 항상 저를 위해 일합니다! – iiFreeman

관련 문제