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 ファイルでは、.h を設定しましたUIActionSheetDelegate
。
この例外の原因は何ですか? 現在、Xcode 5 を使用しており、シミュレーション iOS 7 で実行しています。
編集:dispatch_asyncの代わりにdispatch_syncを使用して、最初の問題を解決できました。しかし、NSDictionary *params 行で同じ例外が発生しています。コード全体が完了するまでアクションシートが表示されないためです。selectedAccount の値がまだ設定されていないため、実行がこの行に移動する前にアクションシートを表示する方法はありますか?