我正在尝试创建一个包含twitter帐户列表的操作表,但是在创建按钮时我遇到了这个异常。
NSInvalidArgumentException', reason: '*** -[__NSPlaceholderDictionary initWithObjects:forKeys:count:]: attempt to insert nil object from objects[0]'
这是一些重要方法的代码
// 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;
}
}
}
}
日志确实打印i=0, AccountName:twitterusername1
并因上述异常而崩溃。在我的.h文件中,我设置了UIActionSheetDelegate
。
有什么建议导致此例外吗?我目前正在使用Xcode 5并在模拟iOS 7中运行。
编辑:我能够通过使用dispatch_sync而不是dispatch_async来解决初始问题。但是现在我在NSDictionary * params行得到了相同的异常,因为在整个代码完成之前动作表没有出现,有没有办法在执行转移到这一行之前显示动作表,因为尚未设置selectedAccount的值
答案 0 :(得分:1)
尝试替换:
[accounts objectAtIndex:i]
使用先前声明的(在此循环中)变量,例如 -
NSString *name=[accounts objectAtIndex:i]