使用UISearchDisplayController进行搜索 - 在点击tableview单元格时出错

时间:2015-03-22 16:12:32

标签: ios objective-c uitableview parse-platform uisearchdisplaycontroller

我创建了一个视图,通过使用PFQueryTableViewController和UISearchDisplayController来显示Parse服务器上用户类的所有用户,以便进行过滤和搜索。所有这些功能都运行良好,但仍有一个问题,当我点击一个tableview单元格转到其用户详细信息视图时,我收到此错误:

*** Terminating app due to uncaught exception 'NSRangeException', reason: '*** -[__NSArrayM objectAtIndex:]: index 0 beyond bounds for empty array'

这是我的代码:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{
  PFUser *user = (tableView == self.tableView) ? self.objects[indexPath.row] : self.searchResults[indexPath.row];

  static NSString *identifier = @"reuseIdentifier";
  UITableViewCell *cell = [self.tableView dequeueReusableCellWithIdentifier:identifier];
  if (!cell)
  {
    cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault
                                  reuseIdentifier:identifier];
  }

  // display user name
  NSString *userName = [NSString stringWithFormat:@"@%@", user.username];
  cell.textLabel.text = userName;
  cell.textLabel.textColor = [UIColor darkGrayColor];

  // tap user ????
  UITapGestureRecognizer * tap = [UITapGestureRecognizer new];
  [tap addTarget:self action:@selector(handleNameTap:)];
  cell.textLabel.userInteractionEnabled = YES;
  [cell.textLabel addGestureRecognizer:tap];
  //--????

  return cell;
}

- (void)handleNameTap:(UIGestureRecognizer *)tap 
{

  CGPoint touchLocation = [tap locationOfTouch:0 inView:self.tableView];
  NSIndexPath *tappedRow = [self.tableView indexPathForRowAtPoint:touchLocation];

  PAWOtherUserProfileViewController *otherProfileViewController = [[PAWOtherUserProfileViewController alloc] initWithNibName:nil bundle:nil];

  PAWUserProfileViewController *userProfileViewController = [[PAWUserProfileViewController alloc] initWithNibName:nil bundle:nil];

  PFQuery *query = [PFUser query];

  [query whereKey:kPAWParseUsernameKey equalTo:[self.searchResults objectAtIndex:tappedRow.row]];
  NSArray *userArray = [query findObjects];
  PFUser *user = [userArray objectAtIndex:0];

  if ([user.username isEqualToString:[PFUser currentUser].username]) {
    NSLog(@"current user");
    userProfileViewController.modalTransitionStyle = UIModalTransitionStyleCoverVertical;
    [self.navigationController presentViewController:userProfileViewController animated:YES completion:nil];
  } else {
    NSLog(@"other user");
    otherProfileViewController.userPassed = user;

    otherProfileViewController.modalTransitionStyle = UIModalTransitionStyleCoverVertical;
    [self.navigationController presentViewController:otherProfileViewController animated:YES completion:nil];
  }
}

任何人都可以帮助指出我的代码有什么问题或我应该在哪里查看?我已经对它进行了一些搜索,发现大多数人使用故事板和segue技术但我没有使用故事板。非常感谢。

1 个答案:

答案 0 :(得分:2)

我认为错误在这一行:

PFUser *user = [userArray objectAtIndex:0];

UserArray是一个空数组,您正在尝试访问不存在的第一个元素。您需要检查自己userArray是否至少有一个元素。所以你的代码最好看起来像这样:

NSArray *userArray = [query findObjects];
if ([userArray count] == 0 { 
     //do nothing
     return;
}

PFUser *user = [userArray objectAtIndex:0];

编辑:

您不应该为每个单元格使用TapRecognizer来识别它被点击的时间。有一个UITableViewDelegatehttps://developer.apple.com/library/prerelease/ios/documentation/UIKit/Reference/UITableViewDelegate_Protocol/index.html)方法:tableView:didSelectRowAtIndexPath:。在ViewController中实施此方法并丢弃手势识别器。

如果您希望仅在用户完全点击该标签时才会执行操作,UILabel仍然是错误的解决方案。最好使用UIButton

开始使用TableViews的好读物:https://developer.apple.com/library/prerelease/ios/documentation/UserExperience/Conceptual/TableView_iPhone/AboutTableViewsiPhone/AboutTableViewsiPhone.html#//apple_ref/doc/uid/TP40007451-CH1-SW1