UITableView
的标题中有一个按钮。一旦按下内部按钮,我们怎么知道该按钮属于哪个部分?由于tableview是可编辑的,因此在删除某些行时设置按钮的标记并不好。我已经尝试使用indexPathForRowAtPoint:
来获取第一行的indexPath属于该部分,但发生了一些奇怪的事情。有没有更好的方法?
编辑1:
使用标记标识标题的节号后,删除某行时标记不会更新。你可以重新加载tableview来更新标签,但看起来不太好。
对于indexPathForRowAtPoint:
的奇怪行为,我发布了另一个问题:Weird behavior of UITableView method "indexPathForRowAtPoint:"
答案 0 :(得分:3)
上面的答案对我来说似乎已经足够了,但是,如果您不想使用标签,您可以创建一个方法来返回特定视图所属的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方法中,假设你的按钮的超级视图是节标题视图:
-(void)buttonPressed:(UIButton*)sender {
int section = [self sectionNumberForView:sender.superview inTableView:_yourTableView];
}
希望这有帮助!
答案 1 :(得分:3)
我喜欢@LuisCien的答案,因为OP希望避免使用标签。但是(a)答案应该显示如何从按钮到该部分,无论在标题视图的层次结构中找到按钮的深度,以及(b)提供的答案将第0部分与未找到标题的情况相混淆(如果方法传递的是未包含在标头中的视图)。
// 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;
}
无需使用插座的超级视图来调用它。让后代检查做那项工作。
NSInteger section = [self sectionNumberForView:sender inTableView:_yourTableView];
答案 2 :(得分:1)
创建每个headerView并添加UIButton时,可以将其标记设置为该部分的值,并在操作方法中检查该按钮的标记。有点像...
在你的创作中:
- (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
}