如何识别节标题视图的节号

在我的UITableView标题中有一个button。 一旦button被触及,我们怎么知道button属于哪个部分? 由于tableview是可编辑的,当删除一些行时,设置button的标签并不是那么好。 我曾尝试使用indexPathForRowAtPoint:获取属于该部分的第一行的indexPath,但发生了一些奇怪的事情。 有没有更好的方法?

编辑1:

一旦标签被用来识别标题的部分号码,当某行被删除时标签将不会更新。 因为你可以重新加载tableview更新标签,但似乎不是那么好。

对于indexPathForRowAtPoint:的怪异行为indexPathForRowAtPoint:我有另一个问题: UITableView方法“indexPathForRowAtPoint:”奇怪的行为

上面的答案似乎对我来说足够好,但是,如果你不想使用标签,你可以创build一个方法,返回一个特定视图所属的UITableView的部分,如下所示:

 -(int)sectionNumberForView:(UIView*)view inTableView:(UITableView*)tableView { int numberOfSections = [tableView numberOfSections]; int i=0; for(; i < numberOfSections; ++i) { UIView *headerView = [tableView headerViewForSection:i]; if (headerView == view) { break; } } return i; } 

然后在你的Target-Action方法里面,假设你的button的超级视图是section header视图:

 -(void)buttonPressed:(UIButton*)sender { int section = [self sectionNumberForView:sender.superview inTableView:_yourTableView]; } 

希望这可以帮助!

我喜欢@ LuisCien的答案,因为OP要避免标签。 但是(a)答案应该显示如何从button到该部分,不pipe在标题视图的层次结构中find多lessbutton,以及(b)提供的答案将0部分与没有find标题的情况相混淆(如果方法传递一个不包含在标题中的视图)。

 // LuisCien's good suggestion, with modified test and a NotFound return. -(NSInteger)sectionNumberForView:(UIView*)view inTableView:(UITableView*)tableView { NSInteger numberOfSections = [tableView numberOfSections]; for(NSInteger i=0; i < numberOfSections; ++i) { UIView *headerView = [tableView headerViewForSection:i]; if ([view isDescendantOfView:headerView]) return i; } return NSNotFound; } 

没有必要调用这个sockets的superview。 让后代检查做这项工作。

 NSInteger section = [self sectionNumberForView:sender inTableView:_yourTableView]; 

当创build每个headerView并添加UIButton时,可以将其标记设置为该部分的值,并检查button的操作方法中的该标记。 就像是…

在你的创作中:

 - (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section { UIView *view = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 320, 100)]; UIButton *button = [UIButton buttonWithType:UIButtonTypeRoundedRect]; button.frame = CGRectMake(10, 10, 20, 20); [button setTag:section]; [button addTarget:self action:@selector(buttonPressed:) forControlEvents:UIControlEventTouchUpInside]; [view addSubview:button]; return view; } 

然后在你的行动方法:

 - (void)buttonPressed:(UIButton *)sender { int section = sender.tag; // Do something based on the section }