如何在iPhone中单击UIButton时保持选定状态?

时间:2011-01-11 13:55:59

标签: iphone uitableview

我创建了三个按钮,并为正常状态和所选状态设置背景图像。单击按钮时,将一个图像更改为选定状态。但是当滚动表视图时,不保留所选图像(先前选择的单元格),这意味着它是正常状态。

我的代码是,

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

    likeBtn = [UIButton buttonWithType:UIButtonTypeCustom];

    UIImage *likeSelectedImage = [UIImage imageNamed:@"like.png"];

    //set image as background for button in the normal state

    [likeBtn setBackgroundImage:likeSelectedImage forState:UIControlStateNormal];

    [likeBtn addTarget:self action:@selector(likeAction:) forControlEvents:UIControlEventTouchUpInside];

   [cell.contentView addSubview:likeBtn];
 }

我的按钮操作是,

 -(void) likeAction : (id) sender
 {
     UIImage *likeSelectedImg = [UIImage imageNamed:@"like-selected.png"];

     UIImage *likeImg = [UIImage imageNamed:@"like.png"];

           if ([sender isSelected]) {
               [sender setImage:likeImg forState:UIControlStateNormal];
               [sender setSelected:NO];
               }else {
               [sender setImage:likeSelectedImg forState:UIControlStateSelected];
               [sender setSelected:YES];
          }

 }

我的问题是,当我滚动表视图单元格时,不保留先前选择的图像状态。因为cellForRowAtIndex方法已经反复调用,当我滚动表时。所以它会自动设置"[likeBtn setBackgroundImage:likeSelectedImage forState:UIControlStateNormal];"。如何避免这个问题? 那么请帮帮我吧? 谢谢!

4 个答案:

答案 0 :(得分:5)

由于UITableView用于显示数据的设计模式,您看到了这一点。为了最大限度地减少资源使用,只保证当前屏幕上的表格单元格保留在内存中。当单元格在屏幕外滚动时,单元格对象将被回收用于新单元格出现在列表的另一端,从而失去其状态。

我假设您在tableView: cellForRowAtIndexPath:中返回一个单元格时已经修剪了一些代码,但在您发布的代码段中没有任何其他地方引用该变量。这使得在添加按钮之前无法看到你如何获得单元格。

关于你的代码如何工作的黑暗中的一点点,但这里是你需要做什么来保持状态的高级概述。

  1. 创建一些控制器级存储(如NSArray)以保存所有表行的所有按钮状态。
  2. likeAction中确定按钮所在的行(可能在创建时将行号分配给按钮的标记属性)并更新NSArray中相应行的状态
  3. tableView: cellForRowAtIndexPath:中,使用从NSArray为给定indexPath提取的状态,使用正确的图像设置按钮。

答案 1 :(得分:1)

上面的语法不正确:

cell = [[[ToDoSummaryTableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:identifier] autorelease];

给每个单元格一个唯一的标识符,它应该可以工作。

请参阅在XCode IOS api中使用'reuseidentifier'的任何示例代码。

谢谢, 巴拉斯

答案 2 :(得分:0)

您可以为具有标识符的每个单元格使用'reuseIdentifier'。

cell = [[[ToDoSummaryTableViewCell alloc] 
                     initWithStyle:UITableViewCellStyleDefault reuseIdentifier:.<identifier>] autorelease];

答案 3 :(得分:0)

我重新编辑您的上述代码。我希望,我会帮助你。

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

       likeBtn = [UIButton buttonWithType:UIButtonTypeCustom];

       UIImage *likeSelectedImage = [UIImage imageNamed:@"like.png"];

       //set image as background for button in the normal state

       [likeBtn setBackgroundImage:likeSelectedImage forState:UIControlStateNormal];
       [likeBtn setBackgroundImage:likeSelectedImage forState:UIControlStateHighlighted];

       [likeBtn addTarget:self action:@selector(likeAction:) forControlEvents:UIControlEventTouchUpInside];

       [cell.contentView addSubview:likeBtn];
}