我创建了一个视图,通过使用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技术但我没有使用故事板。非常感谢。
答案 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来识别它被点击的时间。有一个UITableViewDelegate
(https://developer.apple.com/library/prerelease/ios/documentation/UIKit/Reference/UITableViewDelegate_Protocol/index.html)方法:tableView:didSelectRowAtIndexPath:
。在ViewController
中实施此方法并丢弃手势识别器。
如果您希望仅在用户完全点击该标签时才会执行操作,UILabel
仍然是错误的解决方案。最好使用UIButton
。