UITableViewCell配置

时间:2012-02-23 14:19:24

标签: objective-c ios5 uitableview subview

我的应用程序中有一个UITableView,它存储了一个URL列表。上表有UITextField和UIButton。 当用户在textField上键入一些URL然后按下按钮时,我会像tableView中的top元素一样添加这些URL。 接下来,当用户选择任何URL时,我想在选定的UITableViewCell中创建一个按钮,让用户可以关注该URL(实际上,这并不重要)。这是didSelectRowAtIndexPath方法定义:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    UITableViewCell *cell = [self.recentUrlsTableView cellForRowAtIndexPath:indexPath];

    UIButton *button = [UIButton new];
    button.frame = CGRectMake(cell.frame.size.width - 34, cell.frame.origin.y + 10, 24, 24);
    button.backgroundColor = [UIColor lightGrayColor];
    [button setTitle:@">" forState:UIControlStateNormal];
    [cell.contentView addSubview:button];
    [button release];
}

但是当我取消选择单元格时,我希望这些按钮消失。所以,我尝试了这个东西(我觉得它看起来很愚蠢,但不幸的是我不知道在那里找到我的按钮的更好方法):

- (void)tableView:(UITableView *)tableView didDeselectRowAtIndexPath:(NSIndexPath *)indexPath
{
    UITableViewCell *cell = [self.recentUrlsTableView cellForRowAtIndexPath:indexPath];
    for (UIView *subview in cell.subviews)
    {
        if ([subview isKindOfClass:[UIButton class]])
            if ([[(UIButton*)subview titleLabel].text isEqualToString:@">"])
            {
                [subview removeFromSuperview];
                [subview release];
            }
    }
}

但这些东西似乎工作不正确 - 而不是释放和消失,按钮开始在另一行 - 甚至那些是空的。

之后,我尝试对- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath方法中的每一行执行相同的操作。但它也没有帮助。

我想,有一些微不足道的问题,但我找不到它。所以,我将非常感谢您的任何帮助!

1 个答案:

答案 0 :(得分:1)

当您向上/向下滚动表格时,可以重复使用表格单元格,并且可以使用完全不同的内容填充单元格(带按钮)(即用于不同的索引路径)。这就是你遇到这种情况的原因。

所以桌子上总是只有一个按钮(或没有按钮)。

如果您从桌子外面创建一个按钮(reatin&保持参考),那么你最好。您的didDeselectRowAtIndexPath将会是这样的:

  - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
        UITableViewCell *cell = [self.recentUrlsTableView cellForRowAtIndexPath:indexPath];

        //you have outside reference for this button
        [button removeFromSuperView];
        button.frame = CGRectMake(cell.frame.size.width - 34, cell.frame.origin.y + 10, 24, 24);
        [cell.contentView addSubview:button];
}

如果这不起作用,您应该使用reloadData和cellForIndexPath的组合。像这样:

   - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
        {
            [self.recentUrlsTableView reloadData];    
        }

    - (void)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
       {
            //create your cell as usually

            if ([cell isSelected]) {  //i'm not sure if this is the right way to detect selected cell

               [button removeFromSuperView];
               button.frame = CGRectMake(cell.frame.size.width - 34, cell.frame.origin.y + 10, 24, 24);
               [cell.contentView addSubview:button];

             } 
       }