0

我有一个NSArray包含一个键列表,这个数组来自一个.plist。

此时我将这个数组写在 a 中UITableView,但这不是排序和分段的。我想对这个数组进行排序,并希望在这个数组中有节,UITableView它以这个数组中每个字符的第一个字符开头。

例如: Sectionname: "A" Celltext: "Ahorn"

我希望你能明白。我现在的代码:

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{

NSArray * sections = [temp allValues];

NSUInteger *tablesections = [sections count];

return tablesections;


}

和:

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

    NSArray * values = [temp allValues];

[EingabeListe addObjectsFromArray:values];

char szDecryptetKey[256];
sleep(0.5);


NSString *cellValue = [values objectAtIndex:indexPath.row];
const char *cString = [cellValue cStringUsingEncoding:NSASCIIStringEncoding];

DecryptKey(cString, szDecryptetKey);

NSString *pnssDecryptetKey = [NSString stringWithFormat:@"%s",szDecryptetKey];


cell.textLabel.font = [UIFont systemFontOfSize:11.0];
cell.textLabel.text = pnssDecryptetKey;

return cell;

谢谢

4

4 回答 4

1

我可能不会把它留在一个数组中。我会把它放在一个NSDictionary字母表中的每个字母都是一个桶,用于字母表的每个第一个字母(和一个部分)。然后获取单个部分的内容就像在字典中查找您想要的第一个字母一样简单。

首先按字母顺序对数组进行排序。这个问题被问了很多次,但这里有一个答案

接下来,遍历数组并根据第一个字母将其添加到字典中。字典中的每个“值”都是一个数组,而不仅仅是一个项目。因此,当您第一次遇到一个字母(比如“g”)时,您将在字典中创建“g”键并添加一个 NSMutable 数组作为值。

作为旁注,我没有添加代码,因为这听起来像是一项家庭作业(当然我可能是错的)。虽然我想帮忙,但我不想为你做这件事。也就是说,如果不清楚或者您需要更多帮助,我很乐意提供)。

于 2013-03-25T12:32:14.597 回答
0

嗨谢谢它工作得很好。但我只能看到我的 .plist 的第一个字符。

我认为错误的行是这一行:

NSString *cellValue = [values objectAtIndex:indexPath.row];

但这是我的代码:

[super viewDidLoad];
self.EingabeListe = [NSMutableArray arrayWithCapacity:20];
NSIndexPath *indexPath = 0;


alphabet = [[NSArray alloc]initWithObjects:@"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",@"123",nil];

datasource = [[NSMutableDictionary alloc]initWithCapacity:[alphabet count]];

int m = 1;
int n = 0;
NSArray * values = [temp allValues];
int c = [values count];

//

char szDecryptetKey[256];
sleep(0.5);


while (m != 0) {
    if ( n == c){
        m = 0;
    }else{
        NSString *cellValue = [values objectAtIndex:indexPath.row];
        const char *cString = [cellValue cStringUsingEncoding:NSASCIIStringEncoding];



        NSString *pnssDecryptetKey = [NSString stringWithFormat:@"%s",szDecryptetKey];

        [EingabeListe addObject:pnssDecryptetKey];
        pnssDecryptetKey = 0;
    }
    n++;

}

for(int i = 0; i<[alphabet count]; i ++)
{
    NSArray *filteredArray = [EingabeListe filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"SELF BEGINSWITH[C] %@", [alphabet objectAtIndex:i]]];
    if([filteredArray count]>0)
        [datasource setObject:[filteredArray sortedArrayUsingSelector:@selector(caseInsensitiveCompare:)] forKey:[alphabet objectAtIndex:i]]; // Dictionary containing sorted array of data with key as alphabets

}
}

在我的 .plist 中有一些测试键和值,如下所示:

值键 sqq hi zzz eg egg bb

但在 my.plist 我只能看到: sqq sqq sqq

为什么?

于 2013-03-26T09:14:01.070 回答
0

我通常为这类应用程序使用免费的 Sensible TableView 框架。您实际上只是将数组扔到框架中,它会自动为您排序和创建所有部分。应该花几分钟来实施,所以我建议检查一下。

于 2013-03-25T19:00:34.360 回答
0

为此,您需要在代码中进行修改;我会解释。

脚步:

  1. 初始化字母数组并根据字母过滤使用源数组。
  2. 现在 dataSource 字典包含按字母过滤的源数据数组。
  3. 现在部分的数量将没有。字典中的数组。
  4. 从数据源字典中加载每个部分的数据源数组。

初始化字母数组和数据源数组:

  alphabet = [[NSArray alloc]initWithObjects:@"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];
                        
  dataSource = [[NSMutableDictionary alloc]initWithCapacity:[alphabet count]];
                    
  sourceArray = [NSArray arrayWithObjects:@"Azz",@"ax",@"aje",@"B",@"C",@"Ca",@"D",@"DD",@"E",@"EE",@"F",@"G",@"F", nil];
   

过滤源数组并将数据添加到字典中,键值作为字母:

for(int i = 0; i<[alphabet count]; i ++)
 {
 NSArray *filteredArray = [sourceArray filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"SELF BEGINSWITH[C] %@", [alphabet objectAtIndex:i]]];
  if([filteredArray count]>0)
   dataSource setObject:[filteredArray sortedArrayUsingSelector:@selector(caseInsensitiveCompare:)] forKey:[alphabet objectAtIndex:i]]; // Dictionary containing sorted array of data with key as alphabets
                    
}

并且您需要自定义节数和行数委托方法。查看示例代码:

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
    
    // Return the number of sections.
    return [[dataSource allKeys] count];
}
 
      - (NSString *)tableView:(UITableView *)aTableView titleForHeaderInSection:(NSInteger)section 
{
                return [[dataSource allKeys] objectAtIndex:section]; 
}

整个源代码:

     - (void)viewDidLoad
        {
            [super viewDidLoad];
         
            
            alphabet = [[NSArray alloc]initWithObjects:@"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];
            
            dataSource = [[NSMutableDictionary alloc]initWithCapacity:[alphabet count]];
            
            sourceArray = [NSArray arrayWithObjects:@"Azz",@"ax",@"aje",@"B",@"C",@"Ca",@"D",@"DD",@"E",@"EE",@"F",@"G",@"F", nil];
            
            for(int i = 0; i<[alphabet count]; i ++)
            {
                NSArray *filteredArray = [sourceArray filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"SELF BEGINSWITH[C] %@", [alphabet objectAtIndex:i]]];
                if([filteredArray count]>0)
                    [dataSource setObject:[filteredArray sortedArrayUsingSelector:@selector(caseInsensitiveCompare:)] forKey:[alphabet objectAtIndex:i]]; // Dictionary containing sorted array of data with key as alphabets
                
            }
            NSLog(@"Filtered Array %@", dataSource);
        
            
        }

        
        #pragma mark - Table view data source
        
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
    
    // Return the number of sections.
    return [[dataSource allKeys] count];
}
 
      - (NSString *)tableView:(UITableView *)aTableView titleForHeaderInSection:(NSInteger)section 
{
                return [[dataSource allKeys] objectAtIndex:section]; 
}

        
        - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
        {
            
        
            return [[dataSource objectForKey:[[dataSource allKeys] objectAtIndex:section]] count];
            
        }
        
        - (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section
        {
            
            return 20;
        }
        - (BOOL)tableView:(UITableView *)tableView shouldIndentWhileEditingRowAtIndexPath:(NSIndexPath *)indexPath
        {
            return NO;
        }
        
        
        - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
        {
            
            originalSource = [dataSource objectForKey:[[dataSource allKeys] objectAtIndex:indexPath.section]];
            
            static NSString *CellIdentifier = @"Cell";
            UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
            if (cell == nil) {
                cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
            }
            cell.textLabel.text = [NSString stringWithFormat:@"%@",[originalSource objectAtIndex:indexPath.row]];
            return cell;
            
        }
        
        
        #pragma mark - Table view delegate
        
        - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
        {
        
        }
        
        

输出将是这样的:

在此处输入图像描述

于 2013-03-25T13:41:38.727 回答