0

こんにちは、アドレス帳セクションの連絡先をテーブルビューにアルファベット順に入力しようとしています。プログラムで CFArray を使用しています。これまでのところ、連絡先をセクションに表示することができました。アルファベットのセクション数は正しいです。しかし問題は、データが最初からロードされる各セクションにあります。つまり、常に A のセクションの名前で始まるため、B のセクションでも A'section などの名前で始まります。したがって、A のセクションのみが正しいです。各セクションの名前が正しく表示されるようにテーブルビューのコードを変更するにはどうすればよいですか。つまり、各セクションの文字 A から名前をロードする代わりに、B のセクションに B、C のセクションに C などの名前をロードする必要があります。 ? 以下は私が実装した私のコードです

- (void)viewDidLoad
{
    [super viewDidLoad];
    [self.friendsTable setBackgroundView:[[UIImageView alloc] initWithImage:[UIImage imageNamed:@"profile_bg.png"]]];

    self.friendListSection = [NSArray arrayWithObjects:@"A",@"B",@"C",@"D",@"E",@"F",@"G",@"H",@"I",@"J",@"K",@"L",@"M",@"N",@"O",@"P",@"Q",@"R",@"S",@"T",@"U",@"V",@"W",@"X",@"Y",@"Z",nil];

}


//Reload function;Address book for changed data
-(void)viewWillAppear:(BOOL)animated
{

    [self reloadAddressBook];
    [friendsTable reloadData];
}
-(void)reloadAddressBook
{

    if(addressBook)
        CFBridgingRelease(addressBook);
    addressBook =ABAddressBookCreate();
    self.persons=ABAddressBookCopyDefaultSource(addressBook);
    contactAdd=ABAddressBookCopyArrayOfAllPeopleInSourceWithSortOrdering(addressBook,self.persons,0);
}

-(NSInteger) tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{

    //Search with Last name

    int contactCount=0, j=0;
    NSString *tweet;
    self.filteredData= CFArrayCreateMutable(kCFAllocatorDefault, 0,&kCFTypeArrayCallBacks);
    for(int i=0;i<CFArrayGetCount(self.contactAdd);i++)
    {
        self.persons=CFArrayGetValueAtIndex(self.contactAdd,i);
        tweet=[[NSString stringWithFormat:@"%@", (__bridge_transfer NSString *)ABRecordCopyValue(self.persons,kABPersonFirstNameProperty)] stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]];
         NSRange contactRange= [[tweet substringToIndex:1] rangeOfString: [self.friendListSection objectAtIndex:section] options:NSCaseInsensitiveSearch];

        if(contactRange.location!=NSNotFound)
        {

            contactCount++;

        }

    }
        return contactCount;

}

-(NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
    return 26;
}

- (NSInteger)tableView:(UITableView *)tableView sectionForSectionIndexTitle:(NSString*)title atIndex:(NSInteger)index
{
    return index;
}

- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section {
    return [self.friendListSection objectAtIndex:section];
}

-(UITableViewCell *) tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier=@"SimpleTableCell";
    AddFriendCellView *cell= [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if(cell==nil)
    {
                   cell= [[AddFriendCellView alloc]initWithdelegate:self];
    }



    self.persons = CFArrayGetValueAtIndex(self.contactAdd, indexPath.row);
    NSString *tweet=[[NSString stringWithFormat:@"%@",(__bridge_transfer NSString *)ABRecordCopyCompositeName(self.persons)] stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]];
    [cell.userNameLabel setText:tweet];

    return cell;
}

@end

// インターフェイス ファイルのプロパティ定義

@property AddFriendCellView *pop;
@property (weak, nonatomic) IBOutlet UITableView *friendsTable;
@property (retain, nonatomic) NSArray *friendListSection;
@property  CFArrayRef contactAdd;
@property  CFMutableArrayRef  filteredData;
@property ABRecordRef persons;
@property ABAddressBookRef addressBook;
@property (retain,nonatomic) ABPersonViewController *currentPersonViews;
4

2 に答える 2

1

問題が indexPath.row にあることがわかったので、グローバルにする方法を管理し、このコードをテーブルビュー内に配置すると、正常に機能しました。

NSUInteger row = 0;
NSUInteger sect = indexPath.section;
for (NSUInteger i = 0; i < sect; ++ i)
    row += [self tableView:tableView numberOfRowsInSection:i];
row += indexPath.row;
self.persons = CFArrayGetValueAtIndex(self.contactAdd, row);
于 2013-09-29T05:47:27.760 に答える
0

tableview:cellForRowAtIndexPath では、行を使用していますが、セクションも考慮する必要があります。indexPath は行とセクションの両方を提供し、セクションを無視しています。

具体的には、次のように言う場所で問題が発生します。

self.persons = CFArrayGetValueAtIndex(self.contactAdd, indexPath.row);
于 2013-09-28T18:31:25.777 に答える