0

我有阶级层次

ParentCell extends UITableViewCell
ChildCell extends ParentCell

ParentCell 有单独的 XIB,在子单元格中,我在 ParentCell XIB 的一个视图中创建并仅添加一个按钮。但我无法为此按钮添加操作。因为即使我正在为 ChildCell 创建一个实例,它也会返回 ParentCell 的实例

因为我使用 loadNibNamed 来获取带有 IBOutlet 连接的 XIB。@ParentCell 类中的 initWithStyle 方法

- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier
{
    self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];
    if (self) {
        self = [[NSBundle mainBundle] loadNibNamed:@"ParentCell" owner:self options:nil]
               [0];
    }
    return self;
}

@ChildCell 类中的 initWithStyle 方法

- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier
{
    self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];
    if (self) {
        self.button=[[UIButton alloc] init];
        [self.contentView addSubview:button];
    }
    return self;
}

@视图控制器

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

                NSLog(@"Cell : %@", cell);  //this have instance of ParentCell instead of ChildCell
            }
}

现在通过这种方式暂时解决了

@ParentCell 类中的 initWithStyle 方法

- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier
{
    self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];
    if (self) {
        NSBundle *mainBundle = [NSBundle mainBundle];
        NSArray *views = [mainBundle loadNibNamed:@"ParentCell"
                                            owner:self
                                          options:nil];
       //Here we are linking the view with appropriate IBOutlet by their tag
       self.lblTitle=[views[0] viewWithTag:100];
       self.lblContent=[views[0] viewWithTag:200];
    }
    return self;
}

@ChildCell 类中的 initWithStyle 方法

- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier
{
    self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];
    if (self) {
        self.button=[[UIButton alloc] init];
        [self.contentView addSubview:button];
    }
    return self;
}

但我不知道这是正确的方法,或者我们有其他更好的方法然后这个..

4

1 回答 1

1

您应该registerNib:forCellReuseIdentifier:在 UITableView 类的 viewDidLoad 处使用该方法。

static NSString *parentCellIdentifier = @"parentCellIdentifier";
static NSString *childCellIdentifier = @"childCellIdentifier";

[self.tableView registerNib:[UINib nibWithNibName:@"ParentCell" bundle:nil] forCellReuseIdentifier:parentCellIdentifier];
[self.tableView registerNib:[UINib nibWithNibName:@"ChildCell" bundle:nil] forCellReuseIdentifier:childCellIdentifier];

(不要忘记在 XIB 文件中设置适当的 ReuseIdentifier)

这是最佳实践,您可以摆脱 initWithStyle 实现。

于 2014-09-03T11:15:59.337 回答