我正在尝试创建一个包含 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 的值尚未设置