[英]NSUserDefaults doubts in iphone SDK
我正在將Twitter集成到我的應用中以共享文本。 我的Twitter集成體系結構是我有兩個Button _btnTwitter
和_btntwitteLogout
,當用戶成功登錄Twitter時,其名稱將顯示在_btntwitterLogout
作為標題。
當用戶點擊_btntwitterLogout
它注銷了Twitter並退出了注銷按鈕,並且出現了登錄按鈕。一切正常。但是,當用戶點擊登錄按鈕( _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;
}
但是當我在Twitter的登錄窗口中點擊“取消”按鈕時,如果用戶已經從Twitter注銷,則會返回帶有注銷按鈕的用戶名。 我的代碼有什么問題嗎? 提前致謝。
編輯
#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);
}
是的,有問題。 每當您點擊_btnTwitter時 ,您都將Twitter_logged設置為yes。 那是不對的。 只有成功登錄后,才應將其設置為yes。 那是當用戶沒有在Twitter登錄窗口上點擊“取消”時。
換句話說,您需要在用戶實際登錄后將Twitter_logged設置為YES,而不是在用戶單擊按鈕_btnTwitter時設置為
似乎SA_OAuthTwitterController具有指向self的委托屬性。 您應該處理該委托方法中設置Twitter_logged YES的代碼。
希望能有所幫助。
編輯:
給定最新代碼,您應該在此處添加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];
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.