2010-12-03 5 views
8

iPhone 응용 프로그램을 가지고 있습니다 : 응용 프로그램을 열면 "LoginView"가 표시됩니다. 애플리케이션에 로그인하면 TabBarController가 표시됩니다. 마지막 세 번째 탭에는 "로그 아웃"버튼이 있습니다. 클릭하면 "LoginView"가 다시 나타납니다. 내 문제는 다시 로그인하면 "오래된"탭바가 보이고 선택한 탭은 세 번째가 아닌 "로그 아웃"버튼이 있다는 것입니다. 또한 사용자가 다른 사용자와 로그인하면 이전 사용자의 이전 데이터를 볼 수 있습니다 (매우 위험). Delegate.h - :iPhone 응용 프로그램에서 tabbar를 "재설정"하는 방법

UITabBarController *tabBarController; 
LoginViewController *loginView; 

- Delegate.m (didFinishLaunchingWithOptions) :

[self.window makeKeyAndVisible]; 

loginView = [[LoginViewController alloc] init]; 

if (YES) { /* if the user is not already logged */ 
    [self.window addSubview:loginView.view]; 
} 

Delegate.m (방법) :

- (void)loginComplete { 
    [loginView dismissModalViewControllerAnimated:YES]; 
    [window addSubview:tabBarController.view]; 
} 

- (void)logoutComplete { 
    [[tabBarController view] removeFromSuperview]; 
    [tabBarController release]; 
    [window addSubview:loginView.view]; 
} 

여기

코드입니다 그리고 두 개의 서로 다른 뷰 컨트롤러에있는 두 가지 방법이 있습니다 :

- (IBAction)login:(id)sender { 

    TabNavisAppDelegate *delegate = 
     (TabNavisAppDelegate *) [[UIApplication sharedApplication] delegate]; 
    [delegate loginComplete]; 
    } 

나는이 고통스러운 문제를 해결할 수있는 방법,

얘들 아 (로그 아웃 방법은 동일합니다)? 그래서, "Foursquare", "Brightkite"등 내가 원하는대로 할 수있는 응용 프로그램 목록이 있습니다. 각각 로그인 화면, 탭바보기 및 로그 아웃 버튼이 있습니다.

감사합니다. @ 모두.

답변

9

로그 아웃이나 다음 로그인에서 모든 종류의 항목을 재설정해야하는 로그인 - 로그 아웃 로그인 상황에서 "NewUserReset"과 같은 알림을 만들고 싶습니다. 원래 상태로 재설정해야하는 모든 것은 알림을 수신하고 필요한 모든 재설정 작업을 수행하는 메서드를 실행합니다. tabbar는 버튼 제목을 로그 아웃, 임시 데이터 구조를 nil/zero/release 등으로 변경합니다.

보기를 조작하지 않으려 고 로그 아웃을 모든 작업과 잘 분리합니다 컨트롤러 및 데이터 저장 및 로그 아웃 탭을 수신 한 컨트롤러의 모습을 볼 수 있습니다.

알림을 보내는 것은 쉽습니다. 사용자가 로그 아웃 버튼을 탭하면이 같은 통지를 보내드립니다 :

[[NSNotificationCenter defaultCenter] postNotificationName:@"JMUserLogout" 
               object:nil]; 

당신은 그것을 호출 할 JMUserLogout이없는, 당신은 당신이 인식하고 뭔가 것이다 문자열을 필요 - 내가 사용 귀하의 이니셜 - 알지 못하는 알림과 같은 이름의 알림을 실수로 보내지 않도록 도와줍니다.

알림이 사라지면 defaultCenter에 등록되어 @ "JMUserLogout"을 수신 대기하는 모든 개체가 사용자가 선택한 모든 작업을 수행합니다.이 선택기, resetForNewUser이 :, 당신이 때 실행하려는 방법의 이름 만이

[[NSNotificationCenter defaultCenter] addObserver:self 
            selector:@selector(resetForNewUser:) 
             name:@"JMUserLogout" 
             object:nil]; 

입니다 : 여기에 개체 레지스터가 (이이 ViewWillLoad 같은 일부 장소 또는 개체의 초기화 방법에 있어야합니다) 방법 알림이 사라집니다. 그 방법은 다음과 같습니다 :

- (void)resetForNewUser:(NSNotification *)notif { 
    // DO SOMETHING HERE 
} 

여기 // 귀하의 응용 프로그램과 관련된 코드를 추가하십시오. 예를 들어 탭 표시 줄을 JMUserLogout 알림의 옵저버로 추가 할 수 있습니다. resetForNewUser : 메소드에서 로그 아웃 버튼의 이름을 Login으로 변경합니다.

이전 사용자의 이전 데이터를 보유하고있는 ViewController 또는 View 또는 데이터 저장소에서 resetForNewUser 메소드는 모든 데이터를 삭제하고 새 사용자와 같은 방식으로 다시 설정합니다. 예를 들어 이전 사용자가 UITextField에 데이터를 입력 한 경우 텍스트를 삭제하면 yourTextFieldName.text = @ "";

마지막으로 할당 해제되기 전에 개체를 옵저버로 제거하는 것이 중요합니다. 통지를 수신하기 위해 등록 된 각 객체의 Dealloc 메소드에서 다음을 추가하십시오.

[[NSNotificationCenter defaultCenter] removeObserver:self]; 

바라 건 말하면 의미가 있습니다. Apple documentation for NSNotificationCenter은 알림을 사용하는 여러 가지 샘플 앱을 제공하며 더 자세히 설명합니다.

+0

당신의 아이디어를 어떻게 실현시킬 수 있습니까? 예를 들어 보셨습니까? –

+0

귀하의 의견에 언급 된 응용 프로그램 (알고 있다면)이 방법이나 다른 사용합니까? (Skype도 괜찮습니다.) –

+0

내 대답을 편집하여 코드 및 자세한 내용을 알려 드리겠습니다. –

0

tabBarController가 출시되지 않는 것 같습니다. [보유 카운트는 해제하기 전에 1이어야합니다.] tabBarController는 어딘가에있을 수 있습니다. 그것의 보유 조사를 검사하십시오.

+0

여기에 [tabbarController release]를 입력해야합니까? : –

+0

안녕하세요 호아킨은 당신의 코멘트에 대해 더 자세히 설명해 주실 수 있습니까? 미안 해요. "[tabbarController release]를 여기에 넣어야합니까?" –

+0

Sagar, 죄송합니다. 클릭을 놓쳤습니다. 보유는 릴리스 전에 2이고, 이후는 1이며, 로그인하고 로그 아웃하면 (보유가 1 임) 앱이 다운됩니다. –

0

tabBarController 개체가 어딘가에 유지되었을 수 있습니다. 그것을 제거하려고합니다.

그리고 로그인에 대한 다음 코드를 사용, 로그 아웃 방법 문제가 해결 될 것입니다 그래서

- (void)loginComplete { 

    // initialize the tabBarController here. like the following 
    if(tabBarController == nil){ 
    tabBarController = [[UITabBarController alloc] init]; 

    } 
    [loginView dismissModalViewControllerAnimated:YES]; 
    [window addSubview:tabBarController.view]; 
} 

- (void)logoutComplete { 
    [[tabBarController view] removeFromSuperview]; 
    [tabBarController release]; 
    tabBarController = nil; 
    [window addSubview:loginView.view]; 
} 

.

+0

내가 무엇을 제거해야하는지 이해가 안됩니다. 감사합니다 Satya –

+0

나는 이것을 넣었습니다 : UITabBarController * newTabBarController = [[UITabBarController alloc] initWithNibName : @ "MainWindow"번들 : nil]; [loginView dismissModalViewControllerAnimated : YES]; self.tabBarController = newTabBarController; \t [window addSubview : tabBarController.view]; 하지만 작동하지 않습니다. '로그인'버튼을 탭하면 '탭바'가 비어 있고 로그인 버튼이 계속 표시됩니다. –

0

로그 아웃 한 후 이전 사용자의 이전 데이터를 재설정하려면 UITabBarController의 viewControllers 속성을 재설정해야합니다.

그래서 UITabBarController를 서브 클래 싱하는 경우 다음 코드는 앱을 원래 상태로 복원해야합니다. 문서에서

self.viewControllers = @[self.viewControllerOne, self.viewControllerTwo, self.viewControllerThree]; 

: 런타임에서이 속성의 값을 변경하는 경우

는, 탭 바 컨트롤러가 새로 설치하기 전에 기존의 뷰 컨트롤러를 모두 제거합니다. 새 뷰 컨트롤러의 탭 막대 항목은 즉시 표시되며 애니메이션 위치에 배치되지 않습니다.

관련 문제