0

我有一个由 SQLite 数据库填充的 UITableView。我添加了基于截面的分组,使用sectionIndextitlesforeview View委托方法,现在选择单元格时,IndexPath的字符串与所选单元格中的文本不同。

我的代码是这样工作的。

  1. 我创建了一个数组来保存 SQLite 数据库中的业务。
  2. 我按字母顺序对该数组进行排序。
  3. 我只使用数据库中企业以字母开头的字母创建一个字母数组。
  4. 我使用该 Array 和 NSPredicate 来提供 Grouped Header 视图,这些视图按业务的首字母按字母顺序进行分组。
  5. Selected Row 被写入 NSUserDefaults 文件,并推送一个 View Controller (iPhone),或者为该键添加一个 Observer (iPad)。

不幸的是,由于添加了标题视图,indexPath.row 现在返回的字符串与所选单元格的 TextLabel 的字符串完全不同,因此显示了不同的业务信息。

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

- (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 个月。任何建议/优化都会被适当记录。

4

1 回答 1

0

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

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

于 2012-07-23T14:57:15.530 回答