0

好的,我正在尝试从一个值中创建一个 indexPath 值,NSArray这样NSDictionary当我进入我的 tableview 时,我可以在旁边放置一个辅助刻度。

我有一个NSArrayNSDictionaries这样的

{
        HAS = 1;
        ISL = 1;
        ISV = 0;
        MAN = BANKING;
        MON = 324;
}

因此,该数组将有大约 80 个这些条目,每个条目都有不同的值..

要创建 IndexPath,我需要计算 MAN 的唯一首字母的数量,直到MAN == selected String这会给我部分编号。

然后我需要计算行的选定部分类型中有多少条目。

我已经从这里得到了一些帮助,但是我没有发现我的逻辑中的缺陷.. 对于我正在计算所有整体的行,而不是从所选部分的开头开始计算我的行数完全被填满。下面是我想要实现的一个例子。

a, aa, b, c, d, dd, ddd, dddd, e, f, g, gg

用户选择 ddd 所以 indexpath 将是

部分

a, b, c, (d), e, f, g = 3

d, dd, (ddd), dddd = 2

我可以像这样得到这个部分

NSArray *MANArray = [sortedArray valueForKey:@"MAN"];

NSMutableArray *letters = [NSMutableArray array];
NSString *currentLetter = nil;
for (NSString *string in MANArray) {
    if (string.length > 0) {
        NSString *letter = [string substringToIndex:1];
        if (![letter isEqualToString:currentLetter]) {
            [letters addObject:letter];
            currentLetter = letter;
        }
    }
}
NSArray *firstLetterArray = [NSArray arrayWithArray:letters];
int sectionCount = 0;
for(int i=0; i<[firstLetterArray count]; i++){
    if( [[firstLetterArray objectAtIndex:i] isEqualToString:completedStringLetter]){
        sectionCount = i;
        NSLog(@"%d", sectionCount);
    }
}

但是当我试图从所选部分获取行数时,我只是卡住了。

任何帮助将不胜感激。

更新:

这是我在选择值之前所做的计数,但就像我说的那样它不正确,因为它需要根据第一个字母从部分开始。

NSNumber * myNumber = [NSNumber numberWithInteger:[modIdString integerValue]];

//                
NSArray *subarray = [sortedArray valueForKey:@"MOD"];
for(int i=0; i<[subarray count]; i++){
   if( [[subarray objectAtIndex:i] isEqualToNumber:myNumber]){
      //you have found it, do whatever you need, and break from the loop
      modelResultIndexPath = nil;
      modelResultIndexPath = [NSIndexPath indexPathForRow:sectionCount inSection:i];
   }
}
4

3 回答 3

2

如何将具有值的数组转换为数组"a, aa, b, c, d, dd, ddd, dddd, e, f, g, gg"中的一个NSDictionary

dict = {
        a = [a, aa];
        b = [b];
        c = [c];
        d = [d, dd, ddd, dddd];
        e = [e];
        f = [f];
        g = [g, gg];
}

然后[[dict allKeys] count]应该给你节数,并[[dict valueForKey:@"d"] count]应该给出相应的行数。

为了将数组转换为字典数组,请使用此代码

NSArray *sortedArray = [arrayData sortedArrayUsingSelector:@selector(localizedCaseInsensitiveCompare:)];
NSMutableDictionary *arraysByLetterDict = [NSMutableDictionary dictionary];

for (NSString *value in sortedArray) {
    NSString *firstLetter = [value substringWithRange:NSMakeRange(0, 1)];
    NSMutableArray *arrayForLetter = [arraysByLetterDict objectForKey:firstLetter];
    if (!arrayForLetter) {
        arrayForLetter = [NSMutableArray array];
        [arraysByLetterDict setObject:arrayForLetter forKey:firstLetter];
    }
    [arrayForLetter addObject:value];
}
NSLog(@"Dictionary: %@", arraysByLetterDict);

索引路径可以计算为,

NSArray *allKeys = [[dict allKeys] sortedArrayUsingSelector:@selector(localizedCaseInsensitiveCompare:)];
int totalSectionCount = [allKeys count];
int totalRowCount = [[dict valueForKey:@"d"] count];

int sectionCount = [allKeys indexOfObject:@"d"];
int rowCount = [[dict valueForKey:@"d"] indexOfObject:@"ddd"];

modelResultIndexPath = [NSIndexPath indexPathForRow:rowCount inSection:sectionCount];
于 2012-11-07T04:22:19.140 回答
0

您可以对原始字典数组使用谓词来过滤掉所有以特定字母开头的字典,然后使用 idexOfObjectPassingTest 找到您要查找的匹配字典的索引:

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF.MAN beginswith[c] '%@'", SELECTED_FIRST_LETTER_OF_MAN];
NSArray *filteredDictionaries = [sortedArray filteredArrayUsingPredicate:predicate];
int rowCount = [filteredDictionaries indexOfObjectPassingTest:^BOOL(id obj, NSUInteger idx, BOOL *stop) {
    NSDictionary *dictionary = (NSDictionary *)obj;

    if ([dictionary[@"MAN"] isEqualToString:SELECTED_MAN]
        && [dictionary[@"MON"] isEqualToString:SELECTED_MON]) {
        return YES;
    } else {
        return NO;
    }
}];
于 2012-11-07T02:53:40.377 回答
0

我正在使用两个具有并行结构的数组。这是我在一个中生成 indexPath 以在另一个中使用的代码:

    var sectionCounter = 0
    var itemsCounter = 0
    stopIdsArray.map({
        $0.map( {
            let indexPath = IndexPath(item:itemsCounter,section:sectionCounter)
            NetworkManager.sharedInstance.getData(stop:$0,indexPath:indexPath)
            itemsCounter += 1
        })
        itemsCounter = 0
        sectionCounter += 1
    })
于 2016-12-11T03:28:02.240 回答