loadNibNamed в базовом классе переопределяет экземпляр дочернего класса

У меня есть класс с

ParentCell extends UITableViewCell
ChildCell extends ParentCell

ParentCell имеет отдельную XIB. В дочерней ячейке я создавал и добавлял только одну кнопку к одному представлению в ParentCell XIB. но я не могу добавить действие для этой кнопки. Потому что даже я создавал экземпляр для ChildCell, который возвращает экземпляр ParentCell

Потому что я использую loadNibNamed, чтобы получить XIB с соединениями IBOutlet. Метод @ initWithStyle в классе ParentCell

- (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;
}

@ initWithStyle метод в классе ChildCell

- (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;
}

@ View Controller

- (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
            }
}

Сейчас временно решается таким способом

Метод @ initWithStyle в классе ParentCell

- (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;
}

@ initWithStyle метод в классе ChildCell

- (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;
}

Но я не знаю, что это правильный подход, или у нас есть какой-то другой лучший подход, чем этот..

1 ответ

Вы должны использовать registerNib:forCellReuseIdentifier: метод в viewDidLoad вашего класса UITableView.

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];

(Не забудьте установить соответствующий ReuseIdentifier в файле XIB)

Это лучшая практика, и вы можете избавиться от своих реализаций initWithStyle.

Другие вопросы по тегам