1

我希望属性“cellViewModel”是通用的,这样我就可以将 BaseCustomCell 与不同类型的模型一起使用。前任。

 struct CELLVIEWMODEL {
   var name: String
   var address: String
 }
 class BaseCustomCell: UITableViewCell {
       var cellViewModel: CELLVIEWMODEL  //should support different model types CELLVIEWMODEL1,CELLVIEWMODEL2
       {
        didSet() {
          setValuesInSubClasses
        }
      }
      func setValuesInSubClasses() {
       //subclass will implement
      }
 }

 class subCell: BaseCustomCell {
     override func setValuesInSubClasses() {
       //set value from cellViewModel
      }
 }

//这就是我从 cellForRowAtIndexPath 方法设置的方式:

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: viewModel.getCellId(), for: indexPath) as! BaseCustomCell
        cell.cellViewModel = viewModel.getCellModelAtIndexPath(indexPath) //this will set values for subclasses
        return cell
    }

现在,我每次都为不同类型的 cellViewModel 创建新的 BaseCustomCell。您能提供任何解决方案吗?

4

1 回答 1

1

有几种方法可以实现您的目标。

您可以使实际的BaseCustomCell玻璃通用,但请注意,如果您使用情节提要,这不是解决方案,因为您需要将通用类型硬编码到情节提要中。

与故事板一起使用的另一个解决方案是将您的视图模型声明为协议,然后您可以将其替换为协议的任何具体实现。

protocol CellViewModel {
    var name: String { get }
    var address: String { get }
}

class BaseCustomCell: UITableViewCell {
    var cellViewModel: CellViewModel {
        didSet() {
            setValuesInSubClasses
        }
    }
    
    func setValuesInSubClasses() {
       //subclass will implement
    }
}

class SubCell: BaseCustomCell {
     override func setValuesInSubClasses() {
       //set value from cellViewModel
      }
 }

然后你viewModel.getCellModelAtIndexPath应该有一个返回类型CellViewModel,所以它可以返回任何符合协议的类型。

所以你只需要声明你的具体单元格视图模型,比如class FirstCellViewModel: CellViewModel { ... }等,你可以从返回它们getCellModelAtIndexPath

于 2020-09-22T08:55:13.270 回答