0

私はこれを頭の周りで数時間ガタガタ鳴らしています。UserProfileViewControllerアプリでいいねやブックマークなどを処理するを作成しようとしています。子コントローラーからaccess_tokenを受け取ります。LoginViewController

私はLoginViewController働いています。リモートシステムに対してUIWebViewを起動します。リモートシステムはログインを処理し、ユーザーのIDであるaccess_tokenを受け取ります。

データを返すためにデリゲートを設定しましたLoginViewControllerが、のゲッターに値が必要だと思いますUserProfileViewController

UserProfileViewController.mがどのように見えるかを想像すると、次のようになりますが、明らかに機能しません。

@synthesize access_token = _access_token;

- (NSString *) access_token  // Getter
{
    if(!_access_token)
    {
        _access_token= [[NSUserDefaults standardUserDefaults] objectForKey:@"access_token"];
        if (!_access_token)
        {
            LoginViewController *loginViewController = [[LoginViewController alloc] init];
            loginViewController.delegate = self;

            [self.navigationController pushViewController:loginViewController animated:YES];
            // I need the access_token here but it won't arrive until delegate_AccessToken is called by LoginViewController
        }
    }
    return _access_token;
}

// received from LoginViewController
- (void) delegate_AccessToken: (NSString *) aAccess_token
{
    // now it's too late to use this in the Getter
}


- (IBOutlet *) likes: (id) sender
{
    [self likeThis: sender access_token: _access_token];
}

access_tokenを取得するために電話をかけるのに適した時期はいつLoginViewControllerですか?

4

2 に答える 2

0

このための適切なパターンは、たとえば、でできるだけ早くUserProfileViewControllerを呼び出すことです。デリゲートが情報を返さなかった場合は、にデータを表示しません が、ユーザーに通知する読み込み中のハッドを表示することができます。アクセストークンを取得しながらロードしてくださいLoginViewControllerviewDidLoadUserProfileViewController

于 2012-06-16T19:06:58.923 に答える
0

したがって、私があなたのフローを正しく理解している場合、ユーザーがログインしていない場合(つまり、ログインしていない限りプロファイルがない場合)にユーザーをUserProfileViewControllerに入れることは意味がありません。だから私がすることは:

  • ParentViewControllerからLoginViewControllerを最初にプッシュして、ユーザーにログインを強制します。これをLoginViewControllerクラス内のNSUSerDefaultsに保存してから、UserProfileViewControllerをプッシュします。

  • 何らかの理由でタイムアウトが発生し、access_tokenが無効になった場合は、NSNotificationsを使用してログアウト操作を実行する必要があります(アプリ内の任意のViewControllerからLogInViewControllerを再度プッシュします)。

タイムアウトが発生したときに通知を投稿します。

NSNotificationCenter *notificationCenter = [NSNotificationCenter defaultCenter];
[notificationCenter postNotificationName:@"performLogOut"
                                  object:nil
                                userInfo:nil];

そのトークンに依存するすべてのViewControllerをリスナーにします。

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

最後に、リッスンしているすべてのViewControllerにperformLogOutを実装し、そこにLogInViewControllerをプッシュして、ユーザーのログインを強制します。

お役に立てれば!

于 2013-03-18T18:39:09.207 に答える