NSUserDefaults сомневается в iphone SDK - PullRequest
0 голосов
/ 11 февраля 2012

Я интегрирую твиттер в свое приложение для обмена текстом. Моя архитектура интеграции с твиттером такова, что у меня есть две кнопки _btnTwitter и _btntwitteLogout, и при успешном входе в систему твиттер его имя будет отображаться в _btntwitterLogout в качестве заголовка.

Когда пользователь нажимает _btntwitterLogout, он выходит из системы, щебет и кнопка выхода из системы скрываются, и кнопка входа приходит. Все происходит нормально. Но когда пользователь нажимает кнопку входа в систему (_btnTwitter), всплывающие окна входа в систему Twitter для входа Цель, вот проблема, с которой сталкиваюсь, когда появляется всплывающее окно, пользователь нажимает кнопку отмены этого всплывающего окна, и здесь предыдущее имя пользователя в кнопке выхода из системы. Это не изменилось. Я установил значения по умолчанию для проверки.

-(IBAction)_clickbtnTwitter:(id)sender
{
[[NSUserDefaults standardUserDefaults] setBool:YES forKey:@"Twitter_logged"];
       [_btntwitterLogeout setTitle:nil forState:UIControlStateNormal];
        _btntwitterLogeout.hidden = NO;
        _btnTwitter.hidden=YES;
    if (_engine) return;
    _engine = [[SA_OAuthTwitterEngine alloc] initOAuthWithDelegate: self];
    _engine.consumerKey = kOAuthConsumerKey;
    _engine.consumerSecret = kOAuthConsumerSecret;

    UIViewController *controller = [SA_OAuthTwitterController controllerToEnterCredentialsWithTwitterEngine: _engine delegate: self];

    if (controller) 
        [self presentModalViewController: controller animated: YES];
    else {
        [_engine sendUpdate: [NSString stringWithFormat: @"Already Updated. %@", [NSDate date]]];

    }
}
}

затем код выхода

-(IBAction)_clickbtntwitterlogeout:(id)sender
{ 

    [[NSUserDefaults standardUserDefaults] setBool:NO forKey:@"Twitter_logged"];
    crosstwitterimage.hidden = YES;
     [_btntwitterLogeout setTitle:nil forState:UIControlStateNormal];
   _btntwitterLogeout.hidden = YES;
    _btnTwitter.hidden=NO;
    _btnTwittermain.enabled = NO;
    [_engine clearAccessToken];
    [_engine clearsCookies];
    [_engine setClearsCookies:YES];
    [[NSUserDefaults standardUserDefaults] removeObjectForKey:@"authData"];
    [[NSUserDefaults standardUserDefaults]removeObjectForKey:@"authName"];
    NSLog(@"%@",[[NSUserDefaults standardUserDefaults]valueForKey:@"authName"]);
    NSLog(@"%@",[[NSUserDefaults standardUserDefaults]valueForKey:@"authData"]);
   [[NSUserDefaults standardUserDefaults] setBool:NO forKey:@"Twitter_logged"];
    [_engine release];
    _engine=nil;   

    NSHTTPCookie *cookie;
    NSHTTPCookieStorage *storage = [NSHTTPCookieStorage sharedHTTPCookieStorage];
    for (cookie in [storage cookies])
    {
        NSString* domainName = [cookie domain];
        NSRange domainRange = [domainName rangeOfString:@"twitter"];
        if(domainRange.length > 0)
        {
            [storage deleteCookie:cookie];

        }
    }

}

в поле зрения

BOOL logged = [[NSUserDefaults standardUserDefaults] boolForKey:@"Twitter_logged"];
;
if (logged == YES) {
    _btnTwitter. hidden = YES;
    _btntwitterLogeout.hidden = NO;
    crosstwitterimage.hidden = NO;
    _btnTwittermain.enabled =YES;
    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];

    //Checks if there is a saved User Name    
    if([defaults objectForKey:@"kTwitterUserName"])
    {
        NSString *username = [defaults objectForKey:@"kTwitterUserName"];
        [_btntwitterLogeout setTitle:username forState:UIControlStateNormal];
        crosstwitterimage.hidden = NO;
    }
}
    else
    {
        _btnTwitter. hidden = NO;
        crosstwitterimage.hidden = YES;
        [_btntwitterLogeout setTitle:nil forState:UIControlStateNormal];
        _btnTwittermain.enabled =NO;
        crosstwitterimage.hidden = YES;

    }

но когда я нажимаю кнопку отмены в окне входа в систему в твиттере, появляется имя пользователя с кнопкой выхода из системы, если пользователь уже вышел из твиттера. Есть ли проблема в моем коде. заранее спасибо.

EDIT

#pragma mark SA_OAuthTwitterEngineDelegate
- (void) storeCachedTwitterOAuthData: (NSString *) data forUsername: (NSString *) username {
    NSUserDefaults          *defaults = [NSUserDefaults standardUserDefaults];

    [defaults setObject: data forKey: @"authData"];
    [defaults synchronize];
}

- (NSString *) cachedTwitterOAuthDataForUsername: (NSString *) username {
    return [[NSUserDefaults standardUserDefaults] objectForKey: @"authData"];
}

    #pragma mark SA_OAuthTwitterControllerDelegate
    - (void) OAuthTwitterController: (SA_OAuthTwitterController *) controller authenticatedWithUsername: (NSString *) username {
        NSLog(@"Authenicated for %@", username);
        [_btntwitterLogeout setTitle:username forState:UIControlStateNormal];
        NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
        [defaults setObject:username forKey:@"kTwitterUserName"];
        [defaults synchronize];
        }

    - (void) OAuthTwitterControllerFailed: (SA_OAuthTwitterController *) controller {
        NSLog(@"Authentication Failed!");
    }

    - (void) OAuthTwitterControllerCanceled: (SA_OAuthTwitterController *) controller {
        NSLog(@"Authentication Canceled.");
    }


    #pragma mark TwitterEngineDelegate
    - (void) requestSucceeded: (NSString *) requestIdentifier {
        NSLog(@"Request %@ succeeded", requestIdentifier);
    }

    - (void) requestFailed: (NSString *) requestIdentifier withError: (NSError *) error {
        NSLog(@"Request %@ failed with error: %@", requestIdentifier, error);
    }

1 Ответ

0 голосов
/ 11 февраля 2012

Да, есть проблема. Всякий раз, когда вы нажимаете _btnTwitter , вы устанавливаете для Twitter_logged значение yes. Это не правильно. Вы должны установить его на Да только при успешном входе в систему. То есть, когда у пользователя есть НЕ , нажмите «Отмена» в окне входа в систему Twitter.

Другими словами, вам нужно установить Twitter_logged на YES после того, как пользователь фактически вошел в систему, а не когда пользователь нажал на кнопку _btnTwitter

Похоже, что SA_OAuthTwitterController имеет свойство делегата, указывающее на себя. Вы должны обработать код для установки Twitter_logged YES в этом методе делегата.

Надеюсь, это поможет.

Edit:

Учитывая последний код, здесь вы должны добавить данные NsUserDefaults

  - (void) OAuthTwitterController: (SA_OAuthTwitterController *) controller authenticatedWithUsername: (NSString *) username {
    NSLog(@"Authenicated for %@", username);
    [_btntwitterLogeout setTitle:username forState:UIControlStateNormal];
    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
    [defaults setObject:username forKey:@"kTwitterUserName"];
    [defaults setBool:YES forKey:@"Twitter_logged"]; // Right here - mbh
    [defaults synchronize];
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...