gpt4 book ai didi

iphone - 苹果 ipad iphone UITableViewCell 与 UIButton : change of Button image on Button Click?

转载 作者:行者123 更新时间:2023-11-28 23:08:00 25 4
gpt4 key购买 nike

我目前正在开发一个包含 UITableView 的应用程序。 UITableView 包含自定义单元格。在 Cell 内部,我提供了一个 UIbutton,用于多行选择。在 tableView 目前我有 30 行,它工作正常但是,当我点击第一行的按钮时,第 6、11、16、21、26 行的按钮也被点击,如果点击第二行之后单击下一行(即第 7、12 等等...)。

代码如下:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{
static NSString *CellIdentifier = @"Cell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil)
{
//
// Create the cell.
//
cell =
[[[UITableViewCell alloc]
initWithFrame:CGRectZero
reuseIdentifier:CellIdentifier]
autorelease];

cell.selectionStyle = UITableViewCellSelectionStyleNone;
indicatorImage = [UIImage imageNamed:@"NotSelected.png"];
indicatorHighImage = [UIImage imageNamed:@"IsSelected.png"];
selectbtn = [UIButton buttonWithType:UIButtonTypeCustom];
selectbtn.frame = CGRectMake(30,122,20,20);
[selectbtn setImage:indicatorImage forState:UIControlStateNormal];
selectbtn.tag = rowCount++;
[cell addSubview:selectbtn];
[selectbtn addTarget:self action:@selector(buttonClicked:) forControlEvents:UIControlEventTouchUpInside];
}
return cell;
}

-(IBAction)buttonClicked:(UIButton *)button
{
if([button isSelected])
{
[button setImage:indicatorImage forState:UIControlStateNormal];
[button setSelected:NO];
}
else
{


UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"Custom Button Pressed"
message:[NSString stringWithFormat: @"You pressed the custom button on cell #%i", button.tag]//pathToCell.row + 1]
delegate:self cancelButtonTitle:@"Great"
otherButtonTitles:nil];
[alertView show];
[alertView release];
[button setImage:indicatorHighImage forState:UIControlStateNormal];
[button setSelected:YES];
}
return;
}

最佳答案

好的,首先,您设置的按钮图像不正确。要设置选中和未选中的按钮状态,您不必在每次按下按钮时更改图像,您只需在创建按钮时执行此操作:

[button setImage:indicatorImage forState:UIControlStateNormal];
[button setImage:indicatorHighImage forState:UIControlStateSelected];

请注意 forState 参数 - 这允许您指定图像将显示的状态,这样按钮将在您设置其选定属性时自动显示其他图像。在 buttonClicked 方法中,您现在可以说:

button.selected = !button.selected; // toggle selection state

现在是第二个问题,选择一个按钮会选择其他按钮的位置是由于表格单元格在表格中循环使用的方式。如果您在一个单元格上设置一些属性(例如选择一个按钮),该单元格将在表格中多次重复使用,并且会保持该状态。一个有 100 行的表格不包含 100 个单元格,它可能有 10 个单元格,当您滚动它时,它只会一遍又一遍地重复使用相同的 10 个单元格。

因此,您不能在表格单元格内存储状态信息。您需要使用模型对象数组来支持表格,并且每次调用 cellForRowAtIndexPath 方法时,您都需要使用等效索引从数组中的对象重置单元格属性。

此外,您在 cellForRowAtIndexPath 方法中的 if (cell == nil) { ... } 子句中所做的一些事情需要移到 if 语句之外,否则它们只会在第一次创建单元格时设置,并且在重新使用时不会再次设置。

因此您的 cellForRowAtIndexPath 方法应如下所示:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{
static NSString *CellIdentifier = @"Cell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

if (cell == nil)
{
cell =
[[[UITableViewCell alloc]
initWithFrame:CGRectZero
reuseIdentifier:CellIdentifier]
autorelease];

cell.selectionStyle = UITableViewCellSelectionStyleNone;
selectbtn = [UIButton buttonWithType:UIButtonTypeCustom];
[selectbtn setImage:[UIImage imageNamed:@"NotSelected.png"] forState:UIControlStateNormal];
[selectbtn setImage:[UIImage imageNamed:@"IsSelected.png"] forState:UIControlStateSelected];
selectbtn.frame = CGRectMake(30,122,20,20);
[cell addSubview:selectbtn];
[selectbtn addTarget:self action:@selector(buttonClicked:) forControlEvents:UIControlEventTouchUpInside];
}

//get a model object from the array
MyModelObject *object = [myBackingArray objectAtIndex:indexPath.row];

//get the button and set its properties
UIButton *button = [cell.subviews lastObject];
button.tag = rowCountindexPath.row;
button.selected = object.mySelectedStateProperty;

return cell;
}

请注意,MyModelObject、myBackingArray 和 object.mySelectedStateProperty 是一个新类的占位符,您将创建一个新类作为单元格数据的模型,并将这些对象的数组存储在 View Controller 中,以充当存储单元格状态的永久位置.

关于iphone - 苹果 ipad iphone UITableViewCell 与 UIButton : change of Button image on Button Click?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8937636/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com