4

以下のコードは機能していますが、バグがあります。シナリオは、アプリシステムに入るためにログインすることから始めます。ログインが成功すると、アプリはUserDefaults(UserId)を設定します。その後、保存されたUserIdを使用してアプリビューをナビゲートできます。設定とタブログアウトに移動すると、UserIdがクリーンアップされ、ログインビューに移動します。

バグ:アプリに再度ログインし、ホームボタンをクリックしてiPhoneデスクトップに移動し、アプリを閉じてからもう一度開くと、UserIdが保存されたままになります。したがって、設定に移動してログアウトすると、UserIdがクリーンアップされ、ログインビューに移動しません。どうしてか分かりません。

コード:

- (IBAction)resetKeychain:(id)sender {

    UIActionSheet *actionSheet = [[UIActionSheet alloc] 
                 initWithTitle:@"Are you sure you want to logout?" 
                 delegate:self 
                 cancelButtonTitle:@"Cancel" 
                 destructiveButtonTitle:@"Logout"
                 otherButtonTitles:nil];
    actionSheet.actionSheetStyle = UIActionSheetStyleDefault;
    [actionSheet showFromTabBar:self.tabBarController.tabBar];
    [actionSheet release];

}

- (void)actionSheet:(UIActionSheet *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex {
    if (buttonIndex ==0) {
        //logout
        NSUserDefaults * defaults = [NSUserDefaults standardUserDefaults];
        //delete user ID fro user Defaults
        [defaults setObject:nil forKey:@"UserId"];
        //redirect to login view

        NewClassMoonAppDelegate * appsDelegate =[[UIApplication sharedApplication] delegate];
        [appsDelegate.window addSubview:[appsDelegate.login view]];

    }
}
4

3 に答える 3

8

ちなみに、フォーマットして一貫性を持たせる必要がある質問から私が解釈できることから、私は次のように信じています。

a)メソッドを呼び出していないため、@"UserID"値が同期されていません。メモリ内のKey-Valueストアを更新しますが、ディスクには書き込みません。つまり、任意の時点で失われます。NSUserDefaults-synchronizeNSUserDefaults

b)に行かないという事実はloginView、いくつかの理由で関係している可能性があります。おそらく、それはすでにあなたのサブビューである可能性がありますUIWindow。したがって、loginアプリデリゲートでプロパティを再利用する代わりに、の新しいインスタンス変数を作成しView Controller、代わりにそれを設定しrootViewControllerます。

- (void)actionSheet:(UIActionSheet *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex {

    if (buttonIndex == 0) {
        NSUserDefaults * defaults = [NSUserDefaults standardUserDefaults];
        [defaults setObject:nil forKey:@"UserId"];
        [defaults synchronize];
        //redirect to login view

        NewClassMoonAppDelegate * appsDelegate =[[UIApplication sharedApplication] delegate];
        LoginViewController *login = [[LoginViewController alloc] initWithNibName...];
        [appsDelegate.window setRootViewController:nil];
        [appsDelegate.window setRootViewController:login];

    }
}
于 2013-01-31T18:44:53.683 に答える
1

Swift

いくつかの変更を加えたmax_の回答から:

let objectsToSave: [String] = [obj1, obj2, obj3]
for key in objectsToSave {
    NSUserDefaults.standardUserDefaults().removeObjectForKey(key)
}

 let appsDelegate = UIApplication.sharedApplication().delegate
 let storyboard = UIStoryboard(name: "MainStoryboard", bundle: nil)
 let newLoginVC: LoginViewController = storyboard.instantiateInitialViewController() as! LoginViewController
 appsDelegate?.window!!.rootViewController = nil
 appsDelegate?.window!!.rootViewController = newLoginVC

編集:私が行った唯一の変更は、initWitNameの代わりにストーリーボードを介してnewLoginVCを初期化することです

于 2015-12-16T02:35:44.510 に答える
0

UINavigationコントローラーのプロパティを作成して合成し、ログアウトボタンに以下のコードを書き込みます

AppDelegate * appDelegateObj =[[UIApplication sharedApplication] delegate];
    login *loginObj = [[login alloc]initWithNibName:@"login" bundle:nil];
    [appDelegateObj.window setRootViewController:nil];
    navObj=[[UINavigationController alloc]initWithRootViewController:loginObj];
    [appDelegateObj.window setRootViewController:navObj];
于 2016-04-06T13:22:59.620 に答える