【问题标题】:Programmatically creating custom cells in objective c?以编程方式在目标 c 中创建自定义单元格?
【发布时间】:2018-05-22 15:18:53
【问题描述】:

我无法显示海关单元格。下面我发布了我的代码的简化版本:

 - (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier {
    self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];

    NSLog(@"Being Called?");
    //reuseID = @"newtableid";
    self.backgroundColor = [UIColor redColor];

    self.name = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, [UIScreen mainScreen].bounds.size.width, 50)];
    self.name.backgroundColor = [UIColor redColor];

    [self addSubview:self.name];

    return self;
}

在我的viewController中,我在ViewDidLoad方法中设置了tableView:

 self.table = [[UITableView alloc] initWithFrame:CGRectMake(0, 100, [UIScreen mainScreen].bounds.size.width, 400) style:UITableViewStylePlain];

 self.table.delegate = self;
 self.table.dataSource = self;
 self.table.backgroundColor = [UIColor blackColor];

 [self.view addSubview:self.table];
 [self.table registerClass:NewTableViewCell.class forCellReuseIdentifier:@"Cell"];

然后,我像这样完成 cellForRowAt 方法:

 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    static NSString *simpleTableIdentifier = @"Cell";

    NewTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:simpleTableIdentifier];

    if (cell == nil) {
        cell = [[NewTableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:simpleTableIdentifier];
}

    cell.backgroundColor = [UIColor blackColor];

    cell.name.text = [_familyDetails objectAtIndex:indexPath.row];

    return cell;
}

问题是,我的单元格上没有显示任何内容。我的 NewTableVIewCell 构造函数被调用,但单元格显示为空白(没有颜色、标签等)我做错了什么?

【问题讨论】:

  • “以编程方式创建自定义单元格”在问题中,但我认为(void)awakeFromNib 来自NewTableViewCell 类?我们在哪里可以看到它的initWithStyle:reuseIdentifier: 代码?
  • 您是否将 tableview 委托方法中的 numberOfRows 和 heightForRows 实现到您的 viewController 中?

标签: ios objective-c uitableview cell-formatting


【解决方案1】:

如果您以编程方式创建单元格,请确保将单元格注册到表格视图。

[self.tableView registerClass:UITableViewCell.class forCellReuseIdentifier:"yourCellId"];

在这种情况下,我使用的是通用的 UITableViewCell。您可以尝试在cellForRowAtIndexPath 中更改它的文本标签,看看是否有效。

如果需要,请务必将其更改为您的自定义单元格类。

【讨论】:

    【解决方案2】:

    为了dequeueReusableCellWithIdentifier,你必须使用

    - (void)registerClass:(Class)cellClass 
    forCellReuseIdentifier:(NSString *)identifier
    

    如果你使用dequeueReusableCellWithIdentifier:forIndexPath:,通常你甚至不需要实例化NewTableViewCell。但是,如果您仍然使用dequeueReusableCellWithIdentifier:,那么您仍然需要实例化您的单元子类(感谢您提醒我Alejandro Ivan)。

    编辑:所以你必须在你的viewDidLoad 中写这样的东西:

    - (void)viewDidLoad {
        [super viewDidLoad];
    
        // Your stuff...
        [self.table registerClass:[NewTableViewCell class] forCellReuseIdentifier: simpleTableIdentifier];
    }
    

    【讨论】:

    • 如果他正在使用dequeueReusableCellWithIdentifier:,他需要实例化它(就像他现​​在正在做的那样)。该方法可能会返回 nil 并使他的应用程序崩溃。只有dequeueReusableCellWithIdentifier:forIndexPath: 确保您不会收到nil
    • 哦,是的,你是对的!忘记了那部分(我不喜欢使用 Storyboard 并忘记了这一点)。
    猜你喜欢
    • 2020-02-08
    • 2011-08-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多