嗨,我正在尝试使用地址簿部分中的联系人按字母顺序填充我的tableview ,我在我的程序中使用CFArray 。到目前为止,我已经设法在部分中显示联系人,并且字母表的部分计数是正确的。但问题是在每个部分中数据是从开始加载的,即它始终以A的部分名称开头,因此在B部分中它也以A'部分的名称开头,依此类推。所以只有A的部分是正确的。如何在tableview中修改我的代码,以便它为每个部分正确显示名称,即而不是从字母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;
答案 0 :(得分:1)
我能够找出问题与indexPath.row有关,所以我设法让它成为全局的,并把这个代码放在我的tableview中,它工作正常。
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);
答案 1 :(得分:0)
在tableview:cellForRowAtIndexPath中,您正在使用该行 - 但您还应该考虑该部分。 indexPath为您提供了行和节,并且您忽略了该节。
具体来说,问题发生在你说:
self.persons = CFArrayGetValueAtIndex(self.contactAdd, indexPath.row);