代码之家  ›  专栏  ›  技术社区  ›  satyanarayana

使用工厂模式在同一表中加载不同的自定义单元格

  •  3
  • satyanarayana  · 技术社区  · 10 年前

    我有3个自定义单元格显示在一个50行的表视图中。 我在 Multiple Custom Cells dynamically loaded into a single tableview

    为单元格创建对象似乎变得很复杂。 根据我的需要,3个单元执行相同的功能,但视图不同,

    我们能用工厂模式构建细胞吗?

    这种模式有什么实现吗?

    - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
    {
          // I would like to create object some like this
          CustomCell *cell = factory.getCell("customCell1", tableView);
    
    }
    

    我有自定义单元格的类图。 enter image description here

    2 回复  |  直到 7 年前
        1
  •  3
  •   arturdev    10 年前
    - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
    {
        UITableViewCell<CustomCellProtocol> *cell = [factory getCellForIndexPath:indexPath tableView:tableView];
    
        // Getting data for the current row from your datasource
        id data = self.tableData[indexPath.row]; 
        [cell setData:data];
    
        return cell;
    }
    

    //您的Factory类。

    - (UITableViewCell<CustomCellProtocol> *)getCellForIndexPath:(NSIndexPath *)indexPath tableView:(UITableView *)tableView
    {
        UITableViewCell<CustomCellProtocol> *cell;
        NSString *cellNibName;
        if (condition1) {
            cellNibName = @"CustomCell1"; //Name of nib for 1st cell
        } else if (condition2) {
            cellNibName = @"CustomCell2"; //Name of nib for 2nd cell
        } else {
            cellNibName = @"CustomCell3"; //Name of nib for 3th cell
        }
    
        cell = [tableView dequeueReusableCellWithIdentifier:cellNibName];
    
        if (!cell) {
            UINib *cellNib = [UINib nibWithNibName:cellNibName bundle:nil];
            [tableView registerNib:cellNib forCellReuseIdentifier:cellNibName];
            cell = [tableView dequeueReusableCellWithIdentifier:cellNibName];
        }
    
        return cell;
    }
    
        2
  •  2
  •   jrturton ShowMe Xcode    10 年前

    工厂方法不合适,因为它不允许您退出队列。

    注册每个自定义类以便在表视图中重用( viewDidLoad 是一个很好的地方):

    [self.tableView registerClass:[CustomCell1 class] forReuseIdentifier:@"customCell1"];
    // Repeat for the other cell classes, using a different identifier for each class
    

    在里面 cellForRowAtIndexPath ,找出所需的类型,然后退出队列:

    CustomCell *cell = [tableView dequeueReusableCellWithIdentifier:identifier forIndexPath:indexPath];
    [cell setData:data]; // all subclasses can do this
    

    将创建一个新的单元格,如果可能,将从池中返回。