UIButton和TextLabel在UITableViewCell中重叠

时间:2014-05-05 10:11:51

标签: ios uitableview uibutton

我已经看过并检查了有关向UIButton添加UITableViewCell的多个问题,但不知怎的,我无法找到我面临的确切问题。向UIButton添加UITableViewCell时,单元格的文本标签与按钮重叠。按钮位于行的开头,后面应该是文本标签。我很可能做错了什么,但我找不到什么。这是我的cellForRowAtIndex代码:

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

    UITableViewCell *cell=[self._tableView dequeueReusableCellWithIdentifier:@"event"];
    Event* event =[self eventForIndexPath:indexPath];

    if(cell==nil)
        cell=[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:@"event"];


    [[cell textLabel] setText:event.customer.name];

    if(event.startTime!=nil)
              [[cell detailTextLabel] setText:event.startTime];

    cell.accessoryType=UITableViewCellAccessoryDisclosureIndicator;

    UIButton *cellButton =(UIButton*) [cell.contentView viewWithTag:CELL_BUTTON_TAG];
    if(cellButton == nil){

        UIButton *cellButton = [UIButton buttonWithType:UIButtonTypeCustom];
        cellButton.tag=CELL_BUTTON_TAG;
        [cellButton setFrame:CGRectMake(0.0f, 0.0f, 44.0f, cell.frame.size.height)];
        [cellButton setImage:[UIImage imageNamed:@"van_green.png"] forState:UIControlStateNormal];
        [cellButton setImage:[UIImage imageNamed:@"location.png"]forState:UIControlStateSelected];
        [cellButton addTarget:self action:@selector(carButtonPressed:) forControlEvents:UIControlEventTouchUpInside];
        cellButton.layer.borderWidth = 0.0;
        [cell.contentView addSubview:cellButton];

    }




    return cell;

}

3 个答案:

答案 0 :(得分:2)

很抱歉,但您的代码完全错误。您使用的方法不正确,而且每次都添加一个按钮。

tableViewCell 重新,所以您必须在INIT单元格时添加按钮和其他UI元素而不是每次都添加,或者您的应用将完成记忆警告,崩溃,不流动等

执行您要执行的操作的正确方法是创建CustomTableViewCell子类UITableViewCell的子类并添加标签和按钮。这很简单:

1)创建一个扩展UITableViewCell的新文件 CustomSearchCell 对象:

<强> CustomSearchCell.h

#import <UIKit/UIKit.h>

@interface CustomSearchCell : UITableViewCell

@property (strong, nonatomic) UIButton *button;
@property (strong, nonatomic) UILabel *lblDetails;

@end

<强> CustomSearchCell.m

#import "CustomSearchCell.h"

@implementation CustomSearchCell

- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier
{
    self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];
    if (self) {
        // Initialization code
        _lblDetails = [[UILabel alloc] initWithFrame:CGRectMake(100, 10, 200, 45)];
        [_lblDetails setFont:[UIFont systemFontOfSize:20.0]];
        [_lblDetails setTextColor:[UIColor blackColor]];

        _button = [[UIButton alloc] initWithFrame:CGRectMake(0, 0, 44, self.frame.size.height)];

        [self.contentView addSubview: _lblDetails];
        [self.contentView addSubview: _button];
    }
    return self;
}

@end

2)在视图控制器中:

#import "CustomSearchCell.h"

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{
    static NSString *CellIdentifier = @"ListCellIdentifier";
    CustomSearchCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (!cell) {
        cell = [[CustomSearchCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
    }

    //Settings

    return cell;
}

另一个问题是当你按下按钮时。您将收到发件人,但是当您拦截触摸时,tableViewCell将可用于不同的indexPath。小心......正确的方法是另一个......当您按下按钮时,您需要以某种方式保存实际的indexPath。 ..

答案 1 :(得分:1)

问题出在这一行[cell.contentView addSubview:cellButton];。当您的单元格重复使用时,单元格已包含单元格按钮,您尝试再次添加该按钮。只需执行以下步骤即可解决此问题。

1)添加按钮标签以从基本视图中获取。

UIButton *cellButton = [UIButton buttonWithType:UIButtonTypeCustom];
cellButton.tag = CELLBUTTONTAG;

2)检查条件视图标记并将其添加到基本视图中,如下所示。

UIButton *cellButton = [cell.contentView viewWithTag:CELLBUTTONTAG];
if(cellButton == nil)
{
  UIButton *cellButton = [UIButton buttonWithType:UIButtonTypeCustom];
  cellButton.tag = CELLBUTTONTAG;
  ...
  [cell.contentView addSubview:cellButton];
}

答案 2 :(得分:0)

你已经将手机按钮的位置设为0.0f。这是重叠的。尝试根据需要更改某些值。

[cellButton setFrame:CGRectMake(0.0f, 0.0f, 44.0f, cell.frame.size.height)];

[cellButton setFrame:CGRectMake(0.0f, some big value, 44.0f, cell.frame.size.height)];