8

iPhone アプリケーションがあります。アプリを開くと、「LoginView」が表示されます。アプリケーションにログインすると、TabBarController が表示されます。3 番目の最後のタブには、[ログアウト] ボタンがあります。クリックすると、「LoginView」が再び表示されます。私の問題は、再度ログインすると「古い」タブバーが表示され、選択したタブが 1 つではなく 3 番目であり、「ログアウト」ボタンがあることです。また、別のユーザーでログインすると、前のユーザーの古いデータが表示されます(非常に危険です)。

コードは次のとおりです。 - Delegate.h:

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];
}

そして、2 つの異なるビューコントローラーの 2 つのメソッドを次に示します。

- (IBAction)login:(id)sender {

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

(ログアウト方法は同じです)

みんな、どうすればこのつらい問題を解決できますか? そこで、私がやりたいことを実行するアプリケーションのリストを次に示します。「Foursquare」、「Brightkite」などです。それぞれに、ログイン画面、タブバー ビュー、およびログアウト ボタンがあります。

みんな、ありがとう。

4

4 に答える 4

10

ログアウト時または次回のログイン時にあらゆる種類のものをリセットする必要があるlogin-logout-loginの状況では、「NewUserReset」などの通知を作成するのが好きです。元の状態にリセットする必要があるものはすべて、通知をリッスンし、必要なリセットを実行するメソッドを実行します。タブバーはボタンのタイトルをログアウトに変更し、一時的なデータ構造はnil / zero/release自体などになります。

これは、ログアウトを実行する必要のあるすべてのことからうまく切り離しているため、ログアウトタップを受け取ったコントローラーからのビューコントローラーとデータストレージおよびビューの外観を操作しようとはしません。

通知の送信は簡単です。ユーザーが[ログアウト]ボタンをタップすると、次のような通知が送信されます。

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

JMUserLogoutと呼ぶ必要はありません。必要なのは、認識できる文字列と、通知と同じ名前の通知を誤って送信しないようにするための何か(私はイニシャルを使用しました)です。あなたが聞いていることに気づいていません。

その通知が送信されると、@ "JMUserLogout"をリッスンするためにdefaultCenterに登録されているオブジェクトは、選択したアクションを実行します。オブジェクトの登録方法は次のとおりです(これは、ViewWillLoadやオブジェクトの初期化メソッドなどの場所に配置する必要があります)。

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

そこでのセレクターresetForNewUser:は、通知が送信されたときに実行するメソッドの名前にすぎません。そのメソッドは次のようになります。

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

//ここで何かを行うと、アプリに固有のコードを追加します。たとえば、JMUserLogout通知のオブザーバーとしてタブバーを追加できます。そのresetForNewUser:メソッドで、ログアウトボタンの名前をLoginに変更します。

前のユーザーからの古いデータを保持するViewController、View、またはデータストアでは、resetForNewUserメソッドはそのデータをすべて削除し、新しいユーザーの前の状態に戻します。たとえば、前のユーザーがUITextFieldにデータを入力した場合、テキストを削除します。yourTextFieldName.text = @ "";

最後に、オブジェクトの割り当てを解除する前に、オブザーバーとしてオブジェクトを削除することも重要です。通知を受信するために登録した各オブジェクトのDeallocメソッドに、次を追加します。

[[NSNotificationCenter defaultCenter] removeObserver:self];

うまくいけば、それは理にかなっています。NSNotificationCenterのAppleドキュメントでは、詳細が説明されており、通知を使用するいくつかのサンプルアプリが提供されています。

于 2010-12-03T05:41:51.933 に答える
0

tabBarController がリリースされていないようです。[解放する前に保持カウントを 1 にする必要があります] tabBarController がどこかに保持されている可能性があります。その保持回数を確認してください。

于 2010-12-03T05:35:21.793 に答える
0

tabBarController オブジェクトがどこかに保持されている可能性があります。それを取り除いてみてください。

Login、Logout メソッドには次のコードを使用します。

- (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];
}

あなたの問題が解決されますように。

于 2010-12-03T06:42:24.570 に答える