我正在使用tableview,其中我在一个单元格上添加了2个按钮。以下是我使用的代码
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *CellIdentifier = @"Cell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
}
cell.backgroundView =[[UIImageView alloc] initWithImage:[ [UIImage imageNamed:@"list-bg.png"] stretchableImageWithLeftCapWidth:0.0 topCapHeight:5.0] ];
tickbtn = [UIButton buttonWithType:UIButtonTypeCustom];
tickbtn.tag = 200+indexPath.row;
[tickbtn setBackgroundImage:[UIImage imageNamed:@"ok_gray.png"]forState:UIControlStateNormal];
[tickbtn addTarget:self action:@selector(addshed:) forControlEvents:UIControlEventTouchUpInside];
tickbtn.frame = CGRectMake(220, 10, 30, 30);
[cell.contentView addSubview:tickbtn];
NSLog(@"tickbtn tag %ld",(long)tickbtn.tag);
crossbtn = [UIButton buttonWithType:UIButtonTypeCustom];
crossbtn.tag = 400+indexPath.row;
[crossbtn setBackgroundImage:[UIImage imageNamed:@"delete-gray.png"]forState:UIControlStateNormal];
[crossbtn addTarget:self action:@selector(removeshed:) forControlEvents:UIControlEventTouchUpInside];
crossbtn.frame = CGRectMake(250, 10, 30, 30);
[cell.contentView addSubview:crossbtn];
NSLog(@"tickbtn tag %ld",(long)crossbtn.tag);
return cell;
}
在tickbtn和crossbtn上的我正在应用以下行动: -
-(IBAction)addshed:(UIControl *)sender
{
NSIndexPath *indexPath = [NSIndexPath indexPathForRow:sender.tag-200 inSection:0];
UITableViewCell *cell = (UITableViewCell*)[list_table cellForRowAtIndexPath:indexPath];
UIButton *check1 = (UIButton*)[cell.contentView viewWithTag:indexPath.row+200];
UIButton *check2 = (UIButton*)[cell.contentView viewWithTag:indexPath.row+400];
UIImageView *btnimg1 = [[UIImageView alloc] initWithImage:check1.currentBackgroundImage];
//UIImageView *btnimg2 = [[UIImageView alloc] initWithImage:check2.currentBackgroundImage];
NSLog(@"SHED LIST subviews: %@", btnimg1.image);
// Shed_data *sheddata = [[Shed_data alloc] init];
if (btnimg1.image == [UIImage imageNamed:@"ok_gray.png"]) {
//btnimg.image = [UIImage imageNamed:@"ok_gray.png"];
[check1 setBackgroundImage:[UIImage imageNamed:@"ok_green.png"]forState:UIControlStateNormal];
[check2 setBackgroundImage:[UIImage imageNamed:@"delete-gray.png"]forState:UIControlStateNormal];
[self addsheddata:sender];
NSLog(@"tickbtn tag %ld",(long)tickbtn.tag);
}
else if (btnimg1.image == [UIImage imageNamed:@"ok_green.png"])
{
[check2 setBackgroundImage:[UIImage imageNamed:@"delete-red.png"]forState:UIControlStateNormal];
[check1 setBackgroundImage:[UIImage imageNamed:@"ok_gray.png"]forState:UIControlStateNormal];
[self removesheddata:sender];
}
}
-(IBAction)removeshed:(UIControl*)sender
{
//.…………………….. My functionality
}
但是在这两种情况下,只有当我按下单元格的按钮时,才会获得最后一个单元格的标记值。 请找出我的错误并帮助我解决它。你的帮助会非常明显。
答案 0 :(得分:1)
试试这个对我来说很好。我刚用我的Xcode 5
进行了测试。
修改:
1.我创建一个名为_objects NSMutableArray
的{{1}}。并将其提交给我的_objects = [[NSMutableArray alloc]initWithObjects:@"one",@"two",@"thre", nil];
。
2.给tickBtn和crossBtn一个不同的颜色,这样很容易看到。
3.将按钮按下功能更改为UITableView
至UIControl
,如UIButton
,当按下按钮时,我会抓住标签值并将其打印在控制台上。
-(IBAction)addshed:(UIButton *)sender
新问题更新
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"Cell" forIndexPath:indexPath];
cell.textLabel.text = [_objects objectAtIndex:indexPath.row];
cell.backgroundView =[[UIImageView alloc] initWithImage:[ [UIImage imageNamed:@"list-bg.png"] stretchableImageWithLeftCapWidth:0.0 topCapHeight:5.0] ];
tickbtn = [UIButton buttonWithType:UIButtonTypeCustom];
tickbtn.tag = 200+indexPath.row;
[tickbtn setBackgroundImage:[UIImage imageNamed:@"ok_gray.png"]forState:UIControlStateNormal];
[tickbtn setBackgroundColor:[UIColor blackColor]];
[tickbtn addTarget:self action:@selector(addshed:) forControlEvents:UIControlEventTouchUpInside];
tickbtn.frame = CGRectMake(220, 10, 30, 30);
[cell.contentView addSubview:tickbtn];
NSLog(@"tickbtn tag %ld",(long)tickbtn.tag);
crossbtn = [UIButton buttonWithType:UIButtonTypeCustom];
crossbtn.tag = 400+indexPath.row;
[crossbtn setBackgroundImage:[UIImage imageNamed:@"delete-gray.png"]forState:UIControlStateNormal];
[crossbtn addTarget:self action:@selector(removeshed:) forControlEvents:UIControlEventTouchUpInside];
crossbtn.frame = CGRectMake(250, 10, 30, 30);
[crossbtn setBackgroundColor:[UIColor greenColor]];
[cell.contentView addSubview:crossbtn];
NSLog(@"tickbtn tag %ld",(long)crossbtn.tag);
return cell;
}
-(IBAction)addshed:(UIButton *)sender {
NSLog(@"add shed %d",sender.tag);
}
-(IBAction)removeshed:(UIButton *)sender {
NSLog(@"remove %d",sender.tag);
}
结果是
正如另一个答案所说
Did you try with 10 or more cells and try with some continuous scroll?
让我清楚这一点,因为我知道它。
contentView是[cell addSubview:crossbtn];// -------- Change here ---------
的子视图。 please review this reference在这里您可以看到UITableViewCell
中实际上有3个子视图。
答案 1 :(得分:0)
我见过问题。这可能会导致此类错误。
Why do you add subviews again and again to your cell's content view.?
也就是说,对于每个cellForRowAtIndexpath:
调用,按钮将添加到单元格。在dequeueReusableCellWithIdentifier:
的情况下,您的最后一个单元格可以在滚动时重复使用任何其他单元格。这会导致你的错误。那就是你的单元格将包含两个按钮。(带有最后一个单元格的标签和当前单元格的标签)。
在这一行[cell.contentView addSubview:tickbtn];
中,你必须根据add一次和crossbtn进行一些更改。
更新:我看到了您更新的问题。我的建议,更好地使用自定义单元格。使用此链接how to create custom cell.。你的代码中有很多混乱。恩。在这一行UITableViewCell *cell = (UITableViewCell*)[list_table cellForRowAtIndexPath:indexPath];
中,它会给出意想不到的结果。不要像这样调用委托方法。
答案 2 :(得分:0)
您需要将按钮添加到单元格子视图而不是单元格的contentview子视图。所以使用这段代码......
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *CellIdentifier = @"Cell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
}
cell.backgroundView =[[UIImageView alloc] initWithImage:[ [UIImage imageNamed:@"list-bg.png"] stretchableImageWithLeftCapWidth:0.0 topCapHeight:5.0] ];
tickbtn = [UIButton buttonWithType:UIButtonTypeCustom];
tickbtn.tag = 200+indexPath.row;
[tickbtn setBackgroundImage:[UIImage imageNamed:@"ok_gray.png"]forState:UIControlStateNormal];
[tickbtn addTarget:self action:@selector(addshed:) forControlEvents:UIControlEventTouchUpInside];
tickbtn.frame = CGRectMake(220, 10, 30, 30);
[cell addSubview:tickbtn];// -------- Change here ---------
NSLog(@"tickbtn tag %ld",(long)tickbtn.tag);
crossbtn = [UIButton buttonWithType:UIButtonTypeCustom];
crossbtn.tag = 400+indexPath.row;
[crossbtn setBackgroundImage:[UIImage imageNamed:@"delete-gray.png"]forState:UIControlStateNormal];
[crossbtn addTarget:self action:@selector(removeshed:) forControlEvents:UIControlEventTouchUpInside];
crossbtn.frame = CGRectMake(250, 10, 30, 30);
[cell addSubview:crossbtn];// -------- Change here ---------
NSLog(@"tickbtn tag %ld",(long)crossbtn.tag);
return cell;
}
答案 3 :(得分:0)
您的代码似乎适用于cellForRowAtIndexpath:
。左错误可能是在按钮点击时获取标记值。尝试使用此代码进行更改: -
-(IBAction)addshed:(UIControl *)sender
{
//.…………………….. My functionality
int selectedRow1 = ((UIControl *)sender).tag;
NSLog(@"No. %d", selectedRow1);
}