我需要为此构建自定义UITableViewCell吗?

时间:2010-11-16 22:41:44

标签: iphone uitableview

我对ipod编程很新,所以请耐心等待。

我试图让cellView中的按钮具有每个单元格的2个值之一,a +和a - 。意思是,按钮会显示+,当你点击它时,它会跳转到 - 。

我设法让按钮工作并更改底层数据,但是在重绘表时我遇到了麻烦。

我添加了注释,我需要将按钮的文本更改为源代码。可以这样做,还是我必须建立一个自定义的uitableviewcell?

Tia,Stefano。

- (UITableViewCell *)tableView:(UITableView *)tableView 
         cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    NSUInteger section = [indexPath section];
    NSUInteger row = [indexPath row];

    //some code

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:
                             SectionsTableIdentifier ];
    if (cell == nil) {
        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault 
                                       reuseIdentifier:SectionsTableIdentifier] autorelease];
        UIImage *buttonUpImage = [UIImage imageNamed:@"button_up.png"];
        UIImage *buttonDownImage = [UIImage imageNamed:@"button_down.png"];
        UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];
        button.frame = CGRectMake(0.0, 0.0, buttonUpImage.size.width, buttonUpImage.size.height);
        [button setBackgroundImage:buttonUpImage forState:UIControlStateNormal];
        [button setBackgroundImage:buttonDownImage forState:UIControlStateHighlighted];
        if (some condition) [button setTitle:@"+" forState:UIControlStateNormal];
        else [button setTitle:@"-" forState:UIControlStateNormal]; 
        [button addTarget:self action:@selector(buttonTapped:) forControlEvents:UIControlEventTouchUpInside];
        cell.accessoryView = button;
    }
    if (someCondition) {
        cell.textLabel.text = @"text1";
    }else {
        cell.textLabel.text = @"text2";
    }

    //I NEED TO CHANGE THE TEXT FOR THE BUTTON HERE.

    return cell;
}

5 个答案:

答案 0 :(得分:2)

由于您正在将按钮设置为单元格的accessoryView,您可以执行以下操作:

UIButton *accButton = (UIButton *)cell.accessoryView;
[accButton setTitle:@"New Text" forState:UIControlStateNormal];

答案 1 :(得分:1)

cell通常不会为nil,这意味着您的单元格设置代码通常会被跳过。您需要确保条件中的每单元设置代码,但是在其后面的代码中。

这样的事情:

- (UITableViewCell *)tableView:(UITableView *)tableView 
         cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    NSUInteger section = [indexPath section];
    NSUInteger row = [indexPath row];

    //some code

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:
                             SectionsTableIdentifier ];
    if (cell == nil) {

        // Note that here, we set up only the things that will not change.

        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault 
                                       reuseIdentifier:SectionsTableIdentifier] autorelease];
        UIImage *buttonUpImage = [UIImage imageNamed:@"button_up.png"];
        UIImage *buttonDownImage = [UIImage imageNamed:@"button_down.png"];
        UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];
        button.frame = CGRectMake(0.0, 0.0, buttonUpImage.size.width, buttonUpImage.size.height);
        [button setBackgroundImage:buttonUpImage forState:UIControlStateNormal];
        [button setBackgroundImage:buttonDownImage forState:UIControlStateHighlighted];
        [button addTarget:self action:@selector(buttonTapped:) forControlEvents:UIControlEventTouchUpInside];
        cell.accessoryView = button;
    }

    UIButton *button = (UIButton *)cell.accessoryView; // get button back, regardless of if we went through init above
    if (someCondition) {
        cell.textLabel.text = @"text1";
        [button setTitle:@"+" forState:UIControlStateNormal];
    }else {
        cell.textLabel.text = @"text2";
        [button setTitle:@"-" forState:UIControlStateNormal]; 
    }

    return cell;
}

答案 2 :(得分:0)

您需要以与设置背景图像相同的方式设置文本 - 您必须将其设置为特定的控件状态。

如果您只是尝试更改myButton.text,它将不会显示。

正确的代码是:

 [button setText:@"Some Text" forState:UIControlStateNormal];

答案 3 :(得分:0)

我相信在向上和向下滚动表格时也会遇到问题。所有单元格都具有相同的标识符,它们将在刷新时重复使用。这意味着单元格并不总是零。因此,附件按钮标题应在条件if (cell == nil) {}

之后更新

答案 4 :(得分:0)

您需要将代码设置按钮的文本向下移动到评论所在的位置。这里的问题是访问您没有指针的按钮。一种方法是在设置单元格时为按钮分配标记,并请求带有该标记的子视图以便稍后获取该单元格。

更好的方法是使用自定义表格视图单元格,如您所示。这项工作并不多,如果您提供房产,您可以直接访问其内容。此外,您可以将状态更改的逻辑推送到该类中。