2009-10-24 2 views
4

나는 UITabBarController가 맨 위에 있고, UINavigationControllers가 그 아래에 있고, UIView 컨트롤러가 그 아래에 있고, 어딘가에 좋은 측정을 위해 던져진 모달 컨트롤러가있는 스크린이 많은 큰 앱이있다.iPhone 앱이 특정 화면으로 시작하도록하려면 어떻게합니까?

사용자는 목록에서 시작 화면을 선택할 수 있습니다. 일단 선택되면 다음에 앱을 시작하면 지정된 화면에서 시작되며 모든 탐색은 마치 탐색 한 것처럼 작동합니다.

UITabBarController 및 UINavigationController를 하위 클래스로 만들 수 없으므로 초기 탐색 정보를 설정하기 위해 ivars를 추가 할 수 없습니다.

그래서 이러한 조건에서 계층 구조를 설정하고 올바른보기 컨트롤러의 화면을 표시하고 신속하게 수행하는 가장 좋은 방법은 무엇입니까?

답변

1

종료하기 전에 NSCoder를 확인하고보기 계층 구조를 저장해야합니다. 이렇게하면로드 할 때보기 계층을 직렬화 해제하고 상태는 동일해야합니다.

+0

재미있는 제안이지만 문제가있을 것이라고 생각합니다. 필요한 전체 컨트롤러의 상태 만 저장하거나 복원 할 필요가 없습니다. 내가 이것을했다면 그것은 전망을 또한 보존 할 것인가? –

+0

NSCoder를 구현하면 필요한 것을 작성하고 필요한 것을 다시 초기화 할 수 있습니다. 이는 앱 자체의 상태가 아닌보기 상태를 빠르게 저장하는 방법입니다.NSUserDefaults 등을 100 번 호출하지 않고도 안전하고 안정적으로 View Controller 등을 다시로드 할 수있는 방법을 제공합니다. – coneybeare

+0

하나의 질문에 coney - 이유는 내가 그것을 내 대답에 나열된 방식으로 사용자가 그것을 통해 진행되는 동안 응용 프로그램의 상태를 저장할 수 있기 때문에 (navigationController 구현하는 네비게이션 컨트롤러에 대한 대리자 설정 : willShowViewController : 애니메이션 또는 didShow). 당신의 접근 방식으로, applicationWillTerminate에 어떤 위험이 있어도 호출되지 않거나 끝나지 않을 것입니까? – bpapa

0

사용자가 매번로드하려는 탭의 인덱스를 저장 한 다음 앱이 시작될 때 UITabBarController.selectedIndex 속성을이 인덱스로 설정하면 UITabBarController.selectedViewController에서 viewDidAppear을 호출해야합니다. 이렇게하면 색인이 표시되도록 설정해야합니다.

+0

그것은 쉬운 부분입니다. 다른 모든 다른보기 컨트롤러는 어떻습니까? –

0

사용자 기본값으로 여러 값을 저장하여이 작업을 수행합니다. 그러나, 내 applicationDidFinishLaunching 메서드는 뷰 컨트롤러를 스택에 밀어 넣기 위해 많은 조건문을 사용하고, 어떤 탭이 선택되었는지 결정하고, 모달 뷰가 표시되는지 결정합니다.

+0

이것은 내가 끝내고 싶지 않은 방식입니다. 한 곳에서 큰 끈을 쳐요. 하지만 다른 방법이 없다면 여기서 끝날거야. –

0

저는 당신이 묘사하고있는 문제가 무엇인지 확실하지 않습니다. 즉, 왜 그냥

중 현재 표시 뷰 저장
  • 다음, 응용 프로그램 종료시 (여러 개의 경로가있는 경우)

  • 또는 사용자의 탐색 경로 (하나 개 거기에 도착하는 방법이있는 경우)
  • 다시 만듭니다 사용자가 ... 당신의 appDidFinishLaunching

에 뷰 계층 구조를 탐색 것처럼?

예를 들어 컨트롤러가 스택에 푸시 될 때 클래스 이름을 저장 한 다음 앱이 다시로드 될 때 컨트롤러 클래스를 개별적으로 만들어 탐색 스택에 밀어 넣을 수 있습니다. 탭 컨트롤러의 경우, 당시에 선택된 탭의 인덱스를 저장해야합니다.

문제/질문이 이보다 복잡하다면, 문제가있는 부분을 설명하기 위해 편집하십시오.

+0

나는 내 목표를 달성하기위한 여러 가지 방법을 알고 있지만 최선을 요구하고있다. 특히 제안 된 메소드는 전체 앱 탐색에 대해 알고있는 코드를 중앙에서 관리해야합니다. 탐색이 업데이트되지 않고 변경되면 중단됩니다. 내가 정말로 찾고있는 것은이를 수행하는 분산 된 객체 지향 방법이다. –

0

다음은 내가 한 일입니다. 두 메소드 모두 appDelegate에 있고 tabBarController는 인스턴스 변수입니다.

- (void)applicationDidEnterBackground:(UIApplication *)application 
{ 
    /* 
    Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later. 
    If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits. 
    */ 

    //Remember the users last tab selection 
    NSInteger tabIndex = self.tabBarController.selectedIndex; 
    NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults]; 
    [userDefaults setInteger: tabIndex forKey:@"activeTab"]; 

    if (![userDefaults synchronize]) 
    { 
     NSLog(@"Error Synchronizing NSUserDefaults"); 
    } 

} 

- (void)applicationDidBecomeActive:(UIApplication *)application 
{ 
    /* 
    Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface. 
    */ 

    //Set the tabBarController to the last visted tab 
    NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults]; 
    int activeTab = [(NSNumber*)[userDefaults objectForKey:@"activeTab"] intValue]; 
    self.tabBarController.selectedIndex = activeTab; 
} 
관련 문제