使用排序数组将字母标题添加到UITableView

时间:2016-05-23 15:21:50

标签: ios objective-c uitableview sorting

我按字母顺序按姓氏排序数组。我想把它分成几个部分,在每个部分(A,B,C等)上方有适当的标题。

以下是我在下面尝试过的内容:

            double res,x,t1,t2,t3,temp;
            char num[10],t4[20],disp[50],c;
            GetWindowText(box2,num,11);
            ifstream inFile;
            temp=atoi(num);
            inFile.open("product.txt");
            while(!inFile.eof())
            {
                inFile>>x;
                inFile>>t4;
                inFile>>t3;
                inFile>>t2;
                inFile>>t1; 
                cout<<x;
                if(x==temp)
                {
                sprintf(disp,"\tId: %.0lf\t\n\tName: %s\t\n\tSale Price: %.0lf\t\n\tDiscount %.2lf\t\n\tProduct Added to Cart",x,t4,t2,t1);                     
                MessageBox(hwnd2,disp, "Product Info", MB_OK);
                break;
                }
            }
            inFile.close();

更新:

这让我更接近我想要的东西。

数据正在加载,正在正确分组并显示标题。

但它不是按字母顺序排列的。

如何改进此代码以按字母顺序显示?

它在我的控制台中按字母顺序显示,而不是在应用程序中。

2 个答案:

答案 0 :(得分:0)

根据定义,NSMutableDictionary无序。如果依赖于存储对象的顺序,这不是自然的选择。我建议你改用NSMutableArray。要存储每个部分的tableview数据,您可以使用此迷你类

@interface MembersWithSameInitial : NSObject

@property (strong) NSString* initial;
@property (strong) NSMutableArray<PCMSMember*>* members;

@end


@implementation MembersWithSameInitial

@end

对成员进行排序后,可以在tableView重新加载之前使用此方法生成tableview的所有数据。

NSMutableArray<MembersWithSameInitial*>* groupedMembers = [[NSMutableArray alloc] init];

for (PCMSMember* member in sortedArray) {
    NSString* inicial = [member.lastName substringToIndex:1];
    MembersWithSameInitial* last = [groupedMembers lastObject];
    if (last && [last.initial isEqualToString:inicial]) {
        [last.members addObject:member];
    } else {
        MembersWithSameInitial* newGroup = [[MembersWithSameInitial alloc] init];
        newGroup.initial = inicial;
        newGroup.members = [[NSMutableArray alloc] initWithObjects:member, nil];
        [groupedMembers addObject:newGroup];
    }
}

由于groupedMembers的结构适合分组的tableView,因此dataSource方法将具有简单的实现。假设您已将groupedMembers存储在属性中。

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
    return self.groupedMembers.count;
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    return self.groupedMembers[section].members.count;
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

    //...
    PCMSMember *currentMember = self.groupedMembers[indexPath.section].members[indexPath.row];
    //...

}

- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section {
    return groupedMembers[section].initial;
}

答案 1 :(得分:0)

建议:

创建两个属性

@property NSMutableArray *keys; // for the letters in alphabetical order
@property NSMutableDictionary *indexedContacts; // same as your implementation.

在方法refreshData中调用方法来创建数据源,然后在主线程上重新加载表视图。

实际上,您不再需要属性memberArraysortedArray。已排序的数组将传递给方法以创建数据源。

- (void)refreshData {
    [[PCMSSessionManager sharedSession] refreshPCMSDataWithCompletion:^(BOOL success, NSString *errorMessage, id resultObject) {
        if (success) {
            NSLog(@"yay!");
            self.membersArray = [[PCMSSessionManager sharedSession] memberArr];

            // Let's sort the array
            NSArray *sortedArray = [self.membersArray sortedArrayUsingComparator:^NSComparisonResult(id a, id b) {
                NSString *first = [(PCMSMember*)a lastName];
                NSString *second = [(PCMSMember*)b lastName];
                return [first compare:second];
            }];

            [self indexMembers:sortedArray];
            dispatch_async(dispatch_get_main_queue(), ^{
                [self.tableView reloadData];
            });

        } else {
            NSLog(@"boooo!!!!");
        }
    }];
}

方法indexMembers初始化属性keysindexedContacts并创建数据源。

- (void)indexMembers:(NSArray *)sortedMembers
{
    self.keys = [[NSMutableArray alloc] init];
    self.indexedContacts = [[NSMutableDictionary alloc] init];

    for (PCMSMember *member in sortedMembers)
    {
        NSString *sortString = member.lastName;
        NSString *sortLetter = [sortString substringToIndex:1];

        /* see if that letter already exists as an index */

        NSArray *keyArray = self.indexedContacts[sortLetter];
        NSMutableArray *valueArray;
        if (keyArray) {
            // array for key exists, use it
            valueArray = [keyArray mutableCopy];
        } else {
            // array for key does not exist, create a new one
            valueArray = [NSMutableArray new];
            // and add the letter to keys
            [self.keys addObject:sortLetter];
        }
        [valueArray addObject:member];
        self.indexedContacts[sortLetter] = [valueArray copy];
    }
}

numberOfSectionsInTableView返回键数

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
    return self.keys.count;
}

numberOfRowsInSection获取给定部分的相应数组并返回项目数。

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    NSString *letter = self.keys[section];
    NSArray *memberArray = self.indexedContacts[letter];
    return memberArray.count;
}

cellForRowAtIndexPath中使用方法dequeueReusableCellWithIdentifier: forIndexPath:始终获得有效的单元格。然后在numberOfRowsInSection中获取实际的成员数组并填充标签。

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    static NSString *cellIdentifier = @"cellIdentifier";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier forIndexPath:indexPath];

    // Configure the cell...
    cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
    if (self.isPhysician == YES) {
        NSString *letter = self.keys[indexPath.section];
        NSArray *memberArray = self.indexedContacts[letter];
        PCMSMember *currentMember = memberArray[indexPath.row];
        cell.textLabel.text = [NSString stringWithFormat:@"%@ %@", currentMember.firstName, currentMember.lastName];
    }

    return cell;
}

titleForHeaderInSection只返回

部分的字母
- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section {
    return self.keys[section];
}

你打电话给indexedMembers太多了。这非常昂贵。

我无法测试代码,可能有self或其他缺失的东西,但您会看到工作流程。