首先,这是我出队cells的方式:

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

    switch (indexPath.row) {
        case 0:
        {
            UINib *nib = [UINib nibWithNibName:@"TableViewCellLabel" bundle:nil];
            [tableView registerNib:nib forCellReuseIdentifier:@"CellLabel"];

            cell = (TableViewCellLabel *)[tableView dequeueReusableCellWithIdentifier:@"CellLabel"];
        }
            break;

        case 1:
        {
            UINib *nib = [UINib nibWithNibName:@"TableViewCellTextfield" bundle:nil];
            [tableView registerNib:nib forCellReuseIdentifier:@"CellTextfield"];

            cell = (TableViewCellTextfield *)[tableView dequeueReusableCellWithIdentifier:@"CellTextfield"];
        }
            break;

        default:
            break;
    }


然后,我将在willDisplayCell委托方法中设置其属性:

-(void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath
{
    // set transparent cell bg
    [cell setBackgroundColor:[UIColor clearColor]];

    // init cell view
    switch (indexPath.row) {
        case 0:
        {
            ((TableViewCellLabel *)cell).tableViewCellType = TableViewCellTypeLabel;
            ((TableViewCellLabel *)cell).delegate = self;
        }
            break;

        case 1:
        {
            ((TableViewCellTextfield *)cell).tableViewCellType = TableViewCellTypeTextfield;
            ((TableViewCellTextfield *)cell).delegate = self;
        }
            break;

        default:
            break;
    }
}


我的预期结果是两个不同的tableViewCellType属性值,但是最终得到两个cells保持相同类型的TableViewCellTypeLabel。我不知道我在哪里做错了,所以我需要一些帮助。谢谢。

最佳答案

首先,在控制器的viewDidLoad()的tableView中注册笔尖。
然后,如果您将表格视图分为两部分,首先要显示CellLabel类型的单元格,然后在第二部分中显示CellTextfield类型的单元格,则应在cellForRowAtIndexPath方法中切换大小写而不是IndexPath的行,但是indexPath.section(您必须在dataSource方法中返回2个段计数),并且不要在其中注册任何内容。如果仅需要2行-请勿更改switch indexPath.row code
接下来,应该在出队后立即在delegate方法中设置单元格(设置tableViewCellTypecellForRowAtIndexPath)。这将使您不必第二次隐式导致类型。
cellForRowAtIndexPath方法的结尾,您将返回已配置的单元格实例。
swift中的示例(在obj-c中,这里的结构很重要):

override func viewDidLoad() {
    super.viewDidLoad()

    var nib = UINib.init(nibName: "TableViewCellLabel", bundle: nil)
    self.tableView.register(nib, forCellReuseIdentifier: "CellLabel")
    nib = UINib.init(nibName: "TableViewCellTextfield", bundle: nil)
    self.tableView.register(nib, forCellReuseIdentifier: "CellTextfield")
}


CellForRow:

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    var cell = UITableViewCell()

    switch indexPath.section {
    case 0:
        guard let cellLabel = tableView.dequeueReusableCell(withIdentifier: "CellLabel") as? TableViewCellLabel else {
            return cell
        }

        cellLabel.tableViewCellType = TableViewCellTypeLabel
        cellLabel.delegate = self

        return cellLabel
    case 1:
        guard let cellField = tableView.dequeueReusableCell(withIdentifier: "CellTextfield") as? TableViewCellTextfield else {
            return cell
        }
        cellField.tableViewCellType = TableViewCellTypeTextfield
        cellField.delegate = self

        return cellField
    default:
        return cell
    }
}


对我来说,请清除:您在numberOfSections中返回1部分,在numberOfRowsInSection中返回2部分?如果项目中的单元格上有静态数字,请使用静态单元格:分别对其进行初始化,保留惰性属性,并在完全希望返回时返回。在这种情况下,您将不会使用dequeueReusableCell

关于ios - 如何设置不同的自定义UITableViewCell的属性,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/49281139/

10-09 08:36
查看更多