为什么当dequeueReusableCellWithIdentifier发生时,单元格中的init方法不会被调用

时间:2019-11-11 09:42:23

标签: ios objective-c uitableview

我的代码如下

viewcontroller.m

- (void)viewDidLoad {
    [super viewDidLoad];

    UITableView *tableView = [[UITableView alloc] init];

    tableView.delegate = self;
    tableView.dataSource = self;
    [tableView registerClass:[TableViewCell class] forCellReuseIdentifier:@"cell"];
}


- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    TableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"cell" forIndexPath:indexPath];
    cell.textLabel.text = @"Hello, world";
    cell.delegate = self;
    return cell;
}

cell.m

- (void)awakeFromNib {
    [super awakeFromNib];
    [self commonInit];
    // Initialization code
}

- (instancetype)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if (self) {
        [self commonInit];
    }
    return self;
}

- (void)commonInit
{
    UILongPressGestureRecognizer *longPress = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(longPress)];
    [self addGestureRecognizer:longPress];
}


- (void)longPress
{
    [self.delegate actionTriggered:self];
}

因此屏幕显示一个只有一个单元格包含“ hello world”的表格视图 长按手势时什么也没发生。

所以我在commonInit中设置了一个断点。 找出这个方法没有被调用。 不知道为什么。以及如何解决。 感谢任何帮助。

1 个答案:

答案 0 :(得分:0)

在“ viewDidLoad”中,创建一个局部变量“ tableView”。该方法完成后,该变量将超出范围。

这行不通。

假设viewcontroller.m文件中的类是从UITableViewController继承的,则只需确保配置现有的tableView属性而不是创建局部变量即可。

-(void)viewDidLoad {
    [super viewDidLoad];

    // UITableView *tableView = [[UITableView alloc] init];  <-- Don't!

    tableView.delegate = self;
    tableView.dataSource = self;
    [tableView registerClass:[TableViewCell class] forCellReuseIdentifier:@"cell"];
}