列表计数在numberOfRowsInSection和cellForRowAtIndexPath之间发生变化

时间:2017-03-03 10:55:33

标签: objective-c uitableview search

TableView存在奇怪的问题。我的应用程序崩溃,因为noOfRow计数与cellForRow调用次数不同。一切都在两者之间完美地工作,有时会发生一些事情,我调试它,发现在调用cellForRow时,tableView-datasource中我发送没有行数的列表是更改。

对于Ex: -

如果noOfRows是14,具有相同的列表,那么

cellForRow只获得该列表的4行。

代码片段如下。我已经添加了日志进行调试。

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    if (self.isSearchOn) {
        NSLog(@"search number of rows: %d",[[self.searchMap allKeys] count]);
        return [[self.searchMap allKeys] count];
    }
    NSLog(@"map number of rows: %d",[[self.drugsMap allKeys] count]);
    return [[self.drugsMap allKeys] count] + 1; //1 for footer cell.
}

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

    if (!self.isSearchOn && indexPath.row == [[self.drugsMap allKeys] count]) {
        return self.footerCell;
    }

    MCIPDrugCell *drugCell = [tableView dequeueReusableCellWithIdentifier:[MCIPDrugCell cellIdentifier]];

    if(drugCell == nil)
        drugCell = [MCIPDrugCell newInstance];

    drugCell.parentController = self;
    drugCell.delegate = self;
    drugCell.handler = self.handler;
    drugCell.currentIndex = self.selectedGeneric;

    NSArray *keys = (self.isSearchOn)?[[self.searchMap allKeys] sortedList]:[[self.drugsMap allKeys] sortedList];

    NSLog(@"searchOn %d\n keys: %@",self.isSearchOn, keys);

    NSString *genericName = [keys objectAtIndex:indexPath.row];
    NSArray *brandsByGeneric = (self.isSearchOn)?[self.searchMap objectForKey:genericName]:[self.drugsMap objectForKey:genericName];

    drugCell = [MCIPDrugCell configureDrugCell:drugCell genericName:genericName withDrugList:brandsByGeneric forIndex:indexPath.row withSelectedIndex:self.selectedGeneric];

    drugCell.btnInfo.tag = indexPath.row;
    [drugCell.btnInfo addTarget:self action:@selector(moveInstruction:) forControlEvents:UIControlEventTouchUpInside];
    drugCell.backgroundColor = [UIColor clearColor];

    return drugCell;
}

调试日志如下: -

2017-03-03 16:06:54.484 mCura[12934:1098450] search number of rows: 14

2017-03-03 16:06:54.536 mCura[12934:1098450] searchOn 1
 keys: (
    "#",
    Cardace,
    Ramipril,
    "Ramipril + Hydrochlorthiazide"
)
2017-03-03 16:06:54.544 mCura[12934:1098450] searchOn 1
 keys: (
    "#",
    Cardace,
    Ramipril,
    "Ramipril + Hydrochlorthiazide"
)
2017-03-03 16:06:54.552 mCura[12934:1098450] searchOn 1
 keys: (
    "#",
    Cardace,
    Ramipril,
    "Ramipril + Hydrochlorthiazide"
)
2017-03-03 16:06:54.560 mCura[12934:1098450] searchOn 1
 keys: (
    "#",
    Cardace,
    Ramipril,
    "Ramipril + Hydrochlorthiazide"
)
2017-03-03 16:06:54.568 mCura[12934:1098450] searchOn 1
 keys: (
    "#",
    Cardace,
    Ramipril,
    "Ramipril + Hydrochlorthiazide"
)

第五次调用cellForRow时,它会崩溃,因为[self.searchMap allKeys]计数已更改为4,因为您看到在日志中打印了键。我怎样才能克服这个问题。

由@CodeChanger configureDrugCell

提出请求
+(MCIPDrugCell *)configureDrugCell:(MCIPDrugCell *)cell
                       genericName:(NSString *)genericName
                      withDrugList:(NSArray *)drugList
                          forIndex:(NSInteger)index
                 withSelectedIndex:(NSInteger)selectedIndex {

    cell.currentIndex = selectedIndex;
    cell.btnGenericName.tag = index;
    cell.btnwriteprescription.tag = index;
    cell.collectionView.tag = index;
    cell.genericIndex = index;

    cell.genericArray = [drugList mutableCopy];

    [cell.btnGenericName setTitle:genericName forState:UIControlStateNormal];
    [cell.collectionView reloadData];

    return cell;
}

0 个答案:

没有答案
相关问题