如何设置不同自定义UITableViewCell的属性

时间:2018-03-14 15:03:57

标签: ios objective-c uitableview properties

首先,这是我将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。我无法弄清楚我在哪里做错了所以我需要一些帮助。谢谢。

1 个答案:

答案 0 :(得分:1)

首先在控制器的viewDidLoad()的tableView中注册nib 然后,如果您将表视图分成两个部分,首先要显示CellLabel类型的单元格,而在CellTextfield类型的第二部分单元格中,您应该在{{}}中切换大小写不是IndexPath的行{1}}方法,但是cellForRowAtIndexPath(你必须在dataSource方法中返回2个部分),而不是在那里注册任何东西。如果您只需要2行 - 请勿更改indexPath.section 接下来,您应该在出列后立即在switch indexPath.row code方法中设置您的单元格(设置delegatetableViewCellType)。这样您就不会在第二次隐式引导类型 在cellForRowAtIndexPath方法结束时,您将返回已配置的单元格实例 swift中的示例(在obj-c相同,结构在这里很重要):

cellForRowAtIndexPath

CellForRow:

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")
}

请告诉我:您在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 } } 中返回1个部分,在numberOfSections中返回2个部分?如果项目中的单元格上有静态数字,请使用静态单元格:单独初始化它们,保留延迟属性,当您确切地希望返回它时返回。在这种情况下,您不会使用numberOfRowsInSection