我正在尝试创建一个包含Twitter帐户列表的操作表,这是我的代码。
这是一些重要方法的代码
//SocialNetworking.m文件
- (BOOL)loginWithTwitterCompletionBlock:(UIView *)sender :(void (^)(User *,ACAccount *selAccount, NSError *))completionBlock
{
ACAccountStore *store = [[ACAccountStore alloc] init];
ACAccountType *twitterType = [store accountTypeWithAccountTypeIdentifier:ACAccountTypeIdentifierTwitter];
[store requestAccessToAccountsWithType:twitterType withCompletionHandler:^(BOOL granted, NSError *error) {
NSArray *twitterAccounts = [store accountsWithAccountType:twitterType];
if(twitterAccounts == nil || [twitterAccounts count] == 0) {
NSMutableDictionary* details = [NSMutableDictionary dictionary];
[details setValue:@"Account unavailable" forKey:NSLocalizedDescriptionKey];
NSError *error=[NSError errorWithDomain:@"authentication" code:10 userInfo:details];
completionBlock(nil,nil, error);
} else {
if (granted && !error)
{
twitterAccountsArray = [store accountsWithAccountType:twitterType];
if ([twitterAccountsArray count] > 1)
{
dispatch_sync(dispatch_get_main_queue(), ^{
[self accountListActionSheetDynamic:twitterAccountsArray Sender:sender];
});
}
else
{
selectedAccount = [twitterAccounts objectAtIndex:0];
}
}
NSURL *userDetailsURL=[NSURL URLWithString:@"https://api.twitter.com/1.1/users/show.json"];
//Getting the exception in this line below
NSDictionary *params = @{@"screen_name" : selectedAccount.username,
@"entities" : @"0"};
TWRequest *request = [[TWRequest alloc] initWithURL:userDetailsURL parameters:params requestMethod:TWRequestMethodGET];
[request setAccount:selectedAccount];
[request performRequestWithHandler:^(NSData *responseData, NSHTTPURLResponse *urlResponse, NSError *error)
{
if (responseData)
{
NSError *error = nil;
NSDictionary *responseDict = [NSJSONSerialization JSONObjectWithData:responseData options:NSJSONReadingMutableLeaves error:&error];
User *socialUser=[[User alloc] init];
socialUser.twitterName=[responseDict valueForKey:@"name"];
socialUser.twitterUserName=selectedAccount.username;
socialUser.twitterProfileId = [responseDict valueForKey:@"id_str"];
socialUser.twitterProfileImageURLString=[responseDict valueForKey:@"profile_image_url"];
socialUser.twitterProfileBackgroundURLString=[responseDict valueForKey:@"profile_background_image_url"];
completionBlock(socialUser,selectedAccount, nil);
}
else
{
completionBlock(nil,nil, error);
}
}];
}
//Action sheet For Multiple TwitterAccounts
- (void)accountListActionSheetDynamic:(NSArray *) accounts Sender:(UIView*) senderView {
UIActionSheet *sheet = [[UIActionSheet alloc]
initWithTitle:@"Choose a Twitter Account"
delegate:self
cancelButtonTitle:nil
destructiveButtonTitle:nil
otherButtonTitles:nil];
for(int i=0;i<accounts.count;i++)
{
NSLog(@"i=%d,AccountName:%@",i,[[accounts objectAtIndex:i] valueForKey:@"username"]);
[sheet addButtonWithTitle:[[accounts objectAtIndex:i] valueForKey:@"username"]];
}
[sheet addButtonWithTitle:@"Cancel"];
sheet.cancelButtonIndex = sheet.numberOfButtons-1;
[sheet showFromRect:senderView.bounds inView:senderView animated:YES];
}
-(void) actionSheet:(UIActionSheet *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex
{
if (buttonIndex == actionSheet.cancelButtonIndex)
{
return;
}
else
{
for(int i=0;i<twitterAccountsArray.count;i++)
{
if([[actionSheet buttonTitleAtIndex:buttonIndex] caseInsensitiveCompare:[[twitterAccountsArray objectAtIndex:i] valueForKey:@"username"]]==NSOrderedSame)
{
selectedAccount = [twitterAccountsArray objectAtIndex:i];
return;
}
}
}
}
现在的问题是,我在NSDictionary * params行遇到了异常,因为在整个代码完成之前,不会出现操作表,在执行移至NSDictionary * params行之前,有什么方法可以显示该操作表作为selectedAccount的值尚未设置。
有什么建议或替代解决方案吗?我目前正在使用Xcode 5,并在模拟iOS 7中运行。
最佳答案
将该代码封装到带有参数的函数中,该参数将为selectedAccount。
从2个地方调用此函数:
selectedAccount = [twitterAccounts objectAtIndex:0]之后的
关于ios - 如何等待委托(delegate)方法完成块内的 Action 表,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/19856495/