0

連絡先の名前と電話番号を取得しています。アプリケーションのアドレス帳から。それらをログに出力していますが、正常に動作しています。しかし、それらをテーブル ビューに表示しようとすると、例外 NSInvalidArgumentException が発生します。ビューコントローラーにボタンがあり、これを押すと、テーブルビューに連絡先の名前とその番号が入力されます。

- (IBAction)syncContacts:(id)sender
{
    ABAddressBookRef addressBook = ABAddressBookCreate();
    CFArrayRef allPeople = ABAddressBookCopyArrayOfAllPeople(addressBook);
    for (int i = 0; i < ABAddressBookGetPersonCount(addressBook); i++) {
        ABRecordRef ref = CFArrayGetValueAtIndex(allPeople, i);

        NSString *contact = (NSString *)CFBridgingRelease(ABRecordCopyCompositeName(ref));

       // NSString* phone = nil;

        ABMultiValueRef phoneNumbers = ABRecordCopyValue(ref,kABPersonPhoneProperty);

      //  if (ABMultiValueGetCount(phoneNumbers) > 0) {

        NSString *phone = (__bridge_transfer NSString*)
            ABMultiValueCopyValueAtIndex(phoneNumbers, 0);

      //  }
        NSDictionary *curContact=[NSDictionary dictionaryWithObjectsAndKeys:(NSString *)contact,@"Name",phone,@"phone",nil];

        [self.phoneContacts addObject:curContact];
    }

    tableView.delegate = self;
    tableView.dataSource = self;
    [tableView reloadData];


    NSLog(@"%@",self.phoneContacts);

    NSLog(@"%i",[self.phoneContacts count]);




}

また、テーブル ビュー メソッドは次のとおりです。

-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    return [self.phoneContacts count];
}
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
    return 1;
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *simpleTableIdentifier = @"Cell";

    UITableViewCell *cell = [tableView   dequeueReusableCellWithIdentifier:simpleTableIdentifier];

    if (cell == nil) {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:simpleTableIdentifier];
    }

   // cell.textLabel.text = [self.phoneContacts objectAtIndex:indexPath.row];


    cell = [self.phoneContacts objectAtIndex:indexPath.row];
    return cell;


}

テーブルビューの何が問題になっていますか? phoneContacts に名前しかない場合は問題なく動作していました ([phoneContacts addObject:contact])。しかし、辞書オブジェクトを追加すると、この例外がスローされます。

変更しました。

 cell = [[self.phoneContacts objectAtIndex:indexPath.row] objectForKey:@"AddressBook"];

例外は今来ません。しかし、画面には何も表示されません。

編集した方法は次のとおりです。

- (IBAction)syncContacts:(id)sender
{
    ABAddressBookRef addressBook = ABAddressBookCreate();
    CFArrayRef allPeople = ABAddressBookCopyArrayOfAllPeople(addressBook);
    for (int i = 0; i < ABAddressBookGetPersonCount(addressBook); i++) {
        ABRecordRef ref = CFArrayGetValueAtIndex(allPeople, i);
       // NSNumber *contact = (NSNumber *)ABRecordCopyComposite();// (ref));
        NSString *contact = (NSString *)CFBridgingRelease(ABRecordCopyCompositeName(ref));

       // NSString* phone = nil;

        ABMultiValueRef phoneNumbers = ABRecordCopyValue(ref,kABPersonPhoneProperty);

      //  if (ABMultiValueGetCount(phoneNumbers) > 0) {

        NSString *phone = (__bridge_transfer NSString*)
            ABMultiValueCopyValueAtIndex(phoneNumbers, 0);

      //  }
      //  NSDictionary *curContact=[NSDictionary dictionaryWithObjectsAndKeys:(NSString *)contact,@"Name",phone,@"phone",nil];

        contact = [contact stringByAppendingString:@"     "];
        contact = [contact stringByAppendingString:phone];
        [self.phoneContacts addObject:contact];
    }

    tableView.delegate = self;
    tableView.dataSource = self;
    [tableView reloadData];
}

元の投稿で指定されているように、テーブル ビューは変更されません。それは今働いています。

4

1 に答える 1

1

コメント行cell.textLabel.text = [self.phoneContacts objectAtIndex:indexPath.row];が機能しませんか? ブレークポイントを設定して、セルのテキストラベルにテキストが割り当てられているかどうかを確認できますか?

cell = [[self.phoneContacts objectAtIndex:indexPath.row] objectForKey:@"AddressBook"] phoneContacts を のサブクラスとして定義しない限り、を使用してセルを割り当てる ことはできませんUITableViewCell

于 2013-04-27T07:20:52.040 に答える