indexPath.row在didSelectRowAtIndexPath中返回Random Cell TextLabel

时间:2012-07-23 14:47:09

标签: iphone sqlite uitableview nspredicate didselectrowatindexpath

我有一个由SQLite数据库填充的UITableView。我今天使用sectionIndexTitlesForTableView委托方法添加了基于Section的分组,现在当选择Cell时,indexPath.row的String与所选Cell中的文本不同。

我的代码就像这样。

  1. 我创建了一个Array,用于保存SQLite数据库中的业务。
  2. 我按字母顺序排列数组。
  3. 我只使用数据库中企业开头的字母表字母创建一个字母数组。
  4. 我使用该数组和NSPredicate提供Grouped Header视图,按行字母按字母顺序将业务分组。
  5. 将选定行写入NSUserDefaults文件,并按下视图控制器(iPhone),或为该键(iPad)添加观察者。
  6. 不幸的是,自添加标题视图以来,indexPath.row现在返回与所选Cell的TextLabel完全不同的字符串,因此显示不同的Business'信息。

    以下是主要数组的重要代码块。

    - (void)viewDidLoad
    {
     // Lots of code...
     arrayName = [[NSMutableArray alloc] init];
     NameSet = [[NSMutableSet alloc] init];
     sortedArray = [arrayName sortedArrayUsingSelector:@selector(localizedCaseInsensitiveCompare:)];
    
     alphabet = [[NSMutableArray alloc] init];
     [alphabet addObject:@"{search}"];
     for (int i=0; i<[sortedArray count]-1; i++)
     {
      char alphabetUni = [[sortedArray objectAtIndex:i] characterAtIndex:0];
      NSString *uniChar = [NSString stringwithFormat:@"%c", alphabetUni];
      if (![alphabet containsObject:uniChar])
      {
        [alphabet addObject:uniChar];
      }
     }
     }
    
     - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
     {
      return [alphabet count];
     }
    
     - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
     {
     NSInteger rows = 0;
    
     NSString *alpha = [alphabet objectAtIndex:section];
    
     NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF beginswith[c] %@", alpha];
     businesses = [sortedArray filteredArrayUsingPredicate:predicate];
    
     if ([tableView isEqual:self.searchDisplayController.searchResultsTableView]){
        rows = [self.searchResults count];
     }
     else {
        rows = [businesses count];
     }
    
      return rows;
     }
    
     - (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection (NSInteger)section
     {
      return [alphabet objectAtIndex:section];
     }
    
     - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
     {
      NSString *CellIdentifier = @"Cell";
      cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
      if (cell == nil) {
        cell = [[UITableViewCell alloc]
                 initWithStyle:UITableViewCellStyleDefault
                 reuseIdentifier:CellIdentifier];
    
        cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
      }
    
      NSString *alpha = [alphabet objectAtIndex:indexPath.section];
      NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF beginswith[c] %@", alpha];
      businesses = [sortedArray filteredArrayUsingPredicate:predicate];
    
      if ([tableView isEqual:self.searchDisplayController.searchResultsTableView]){
        cell.textLabel.text =
        [self.searchResults objectAtIndex:indexPath.row];
      }
      else{
            NSString *cellValue = [businesses objectAtIndex:indexPath.row];
            cell.textLabel.text = cellValue;
      }
      return cell;
    
      }
    
      - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
     {
     NSString *selected = nil;
    
     if (tableView == self.tableView)
     {
        selected = [businesses objectAtIndex:indexPath.row];
     }
     else if (tableView == searchDis.searchResultsTableView)
     {
        selected = [filteredData objectAtIndex:indexPath.row];
     }
    
     [def setObject:selected forKey:@"NameChoiceDetail"];
    
     if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPhone)
     {
        [self performSegueWithIdentifier:@"NameDetailPush" sender:self];
    
     }
     }
    

    //请原谅我可怕的代码。我只使用Objective-C 4个月,编程约8个月。任何建议/优化都将得到适当的注意。

1 个答案:

答案 0 :(得分:0)

您的表视图使用了部分,但您的tableView:didSelectRowAtIndexPath:实现不会评估索引路径的部分。所以代码遗漏了一些东西。

此外,我发现你使用businesses变量(它可能是一个实例变量)非常奇怪。它在tableView:cellForRowAtIndexPath:中分配了一个值,但在tableView:didSelectRowAtIndexPath:中却没有,即使它在那里使用了。因此,如果后者取决于最后显示的表格单元格的结果,那么结果取决于滚动用户交互。这可能是结果看起来相当随机的原因。