在按钮单击时将默认UITableViewCell更改为自定义子类

时间:2014-07-30 14:43:03

标签: uitableview uibutton uilabel

在特定的行中,我将默认的UITableViewCell类应用于文本标签和附件按钮。单击附件按钮时,单元格将展开,我想将UITableViewCell更改为我创建的自定义子类。但是,即使单元格被展开,它也不会切换到自定义子类。任何想法要解决什么?

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
    CGFloat result;

    switch ([indexPath row])
    {

        case 2:
        {

            if ([indexPath isEqual:expandedRow]) {
                return 100;

            } else {

            return 42;
        }


    }
    return result;
}


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

NSString *CellIdentifier;
NSString *CellIdentifierexp;

UITableViewCell *cell;
    if (cell == nil) {
      if (indexPath.row == 2) {

            if ([indexPath isEqual:expandedRow]) {


                cell = [[ExpandedCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifierexp];

}else{

            cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault  reuseIdentifier:CellIdentifier];
            }

switch ([indexPath row])
    {
      case 2:
        {

            if ([indexPath isEqual:expandedRow]) {

                NSLog(@"bike");

           ExpandedCell *expandedcell = (ExpandedCell *)cell;

                [expandedcell.text setText:self.descr];

                NSArray *indexPathArray=[NSArray arrayWithObject:indexPath];
                [self.tableview reloadRowsAtIndexPaths:indexPathArray withRowAnimation:UITableViewRowAnimationNone];


                   } else {

                       cell.textLabel.text = @"Description";
                       cell.accessoryType = UITableViewCellAccessoryDetailDisclosureButton;
                       cell.selectionStyle = UITableViewCellSelectionStyleNone;
                       cell.textLabel.textColor = UIColorFromRGB(0x2d5b3b);

                       // accessory type image

                       UIImage *image = [UIImage imageNamed:@"greenarrow.jpg"]; //or wherever you take your image from

                       UIButton *button = [[UIButton alloc]initWithFrame:CGRectMake(0,0, image.size.width, image.size.height)];

                       [button setBackgroundImage:image forState:UIControlStateNormal];

                       [button addTarget:self action:@selector(accessoryButtonTapped:withEvent:) forControlEvents:UIControlEventTouchDown];

                       button.userInteractionEnabled = YES;
                       cell.accessoryView = button;


                   }

            break;

        }

return cell;

}






- (void)tableView:(UITableView *)tableView accessoryButtonTappedForRowWithIndexPath:(NSIndexPath *)indexPath {

    switch ([indexPath row])
    {
        case 2:
            {
                 NSLog(@"Detail Disclosure Tapped");

                expandedRow = indexPath;
                [tableview beginUpdates];
                [tableview endUpdates];


            }

    }
}

- (void) accessoryButtonTapped: (UIControl *) button withEvent: (UIEvent *) event
{


    NSIndexPath * indexPath = [self.tableview indexPathForRowAtPoint: [[[event touchesForView: button] anyObject] locationInView: tableview]];

    if ( indexPath == nil )
        return;

    [self.tableview.delegate tableView: self.tableview accessoryButtonTappedForRowWithIndexPath: indexPath];
}

3 个答案:

答案 0 :(得分:1)

哇,你在这里做了一件非常错误的事情:

ExpandedCell *expandedcell = (ExpandedCell *)cell;

[expandedcell.text setText:self.descr];

NSArray *indexPathArray=[NSArray arrayWithObject:indexPath];
[self.tableview reloadRowsAtIndexPaths:indexPathArray withRowAnimation:UITableViewRowAnimationNone];

你应该做的是略有不同。点击按钮,您只需拨打[self.tableview reloadRowsAtIndexPaths:indexPathArray withRowAnimation:UITableViewRowAnimationNone];,然后在cellForRowAtIndexPath中,如果indexPath匹配,您应该返回您方法中子类的自定义单元格。无需在那里更新tableView。

我需要说这对我来说是一个非常奇怪的转换声明:

switch ([indexPath row])
{
    case 2:
        {
             NSLog(@"Detail Disclosure Tapped");

            expandedRow = indexPath;
            [tableview beginUpdates];
            [tableview endUpdates];
        }
}

我只想这样说:

if (indexPath.row == 2){
      NSLog(@"Detail Disclosure Tapped");

      expandedRow = indexPath;
      [tableview beginUpdates];
      [self.tableview reloadRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationNone];
      [tableview endUpdates];
}

答案 1 :(得分:0)

运行代码

expandedRow = indexPath;
[tableview beginUpdates];
[tableview endUpdates];

当点击附件按钮时,只会要求表格视图更新行高,它实际上不会为任何行请求新单元格,因此不会发生单元格类型更改(直到您滚动该行屏幕,然后再次返回)。

因此,您需要实际重新加载选定的行,而不仅仅是开始和结束更新。

答案 2 :(得分:0)

这里......

UITableViewCell *cell;
    if (cell == nil) {

本地变量不会初始化为nil,它们以垃圾开头,可能是零,也许不是。

无论哪种方式,你可能都没有进入分支。

你想要从表格中取出一个单元格,取决于它是否是一个扩展的行

UITableViewCell *cell = nil;
if(thisIsAnExpandedRow) {
    cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifierexp];
    if(!cell) {
       cell = [[ExpandedCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifierexp];
    }

}
else {
     cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if(!cell) {
       cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault  reuseIdentifier:CellIdentifier];

    }
}