【问题标题】:Better way to set cell设置单元格的更好方法
【发布时间】:2020-01-09 12:22:26
【问题描述】:

我开始使用 MVC 编写我的第一个应用程序,但我不知道代码版本在这种模式下是否更好。

在视图控制器中:

 let quantity = quantityProducts[indexPath.row]
 let nameProduct = productsArray[indexPath.row]
 cell.configurateWithItem(quantity: quantity, name: nameProduct)

在单元格中:

class NeedProductsTableViewCell: UITableViewCell {

@IBOutlet weak var quantityLabel: UILabel!
@IBOutlet weak var productNameLabel: UILabel!

func configurateWithItem(quantity:String,name:String){
    quantityLabel.text = quantity
    quantityLabel.textColor = .systemGray
    quantityLabel.font = quantityLabel.font.withSize(14)
    productNameLabel.text = name
    productNameLabel.font = UIFont.boldSystemFont(ofSize: 14)
}

或者标准版本(在视图控制器中设置单元格属性)?

  let cell = tableView.dequeueReusableCell(withIdentifier: "NeedProductsTableViewCell", for: indexPath) as! NeedProductsTableViewCell
        cell.quantityLabel.text = quantityProducts[indexPath.row]
        cell.quantityLabel.textColor = .systemGray
        cell.quantityLabel.font = cell.quantityLabel.font.withSize(14)
        cell.productNameLabel.text = productsArray[indexPath.row]
        cell.productNameLabel.font = UIFont.boldSystemFont(ofSize: 14)

【问题讨论】:

    标签: ios swift xcode tableview cell


    【解决方案1】:

    答案可能基于意见,但我真的看不出使用第二种“标准版本”方法的论据。

    这超出了 MVC,但您应该尽可能关闭公共接口,只公开有意义的属性。所以在大多数情况下使用private

    所以我建议在你的牢房里

    @IBOutlet private var quantityLabel: UILabel!
    @IBOutlet private var productNameLabel: UILabel!
    

    您可以坚持weak,尽管它不是必需的。您还可以使用可选项而不是强制解包值 quantityLabel: UILabel? 而不是 quantityLabel: UILabel! 来提高稳定性。

    因此,一旦您将内部部分设为私有,您就需要检查如何公开您的界面。这仍然有多种模式;一个是您使用的,您的单元格不会保存您注入的对象,而只是修改其视觉表示。另一个看起来像这样:

    class NeedProductsTableViewCell: UITableViewCell {
    
    @IBOutlet private var quantityLabel: UILabel?
    @IBOutlet private var productNameLabel: UILabel?
    
    var item: (quantity: String, name: String)? {
        didSet {
            if let item = item {
                quantityLabel?.text = item.quantity
                quantityLabel?.textColor = .systemGray
                quantityLabel?.font = quantityLabel.font.withSize(14)
                productNameLabel?.text = item.name
                productNameLabel?.font = UIFont.boldSystemFont(ofSize: 14)
            }        
        }
    }
    

    在这种情况下,您将在数据源中使用:

    cell.item = (quantityProducts[indexPath.row], productsArray[indexPath.row])
    

    这也表明您应该尽可能只有 1 个数组。要么使用结构封装两个值,要么简单地使用元组:

    private var items: [(quantity: String, name: String)] = []
    

    而不是

    private var quantityProducts: [String] = []
    private var productsArray: [String] = []    
    

    【讨论】:

    • theLabels?.font; & theLabels.textColor 应该在初始化中设置,不是吗?取决于如何创建单元 awakeFromNib 或 init(style)
    • @Larme 同意。我一开始也是这么想的。但也许 OP 计划在其中某处(或另一种配置方式)设置一个 else 方法来设置其他字体或文本颜色。在这种情况下,这是正确放置的。我在想awakeFromNib,但为什么不在故事板中正确设置它们,对吧?
    • 感谢您的回答。我必须有两个 arrayData,因为我使用 json 解析来解析更大的 dataModel。谢谢你给了我其他设置属性的方法,但现在我不知道哪个类型更好,使用 func 或 var item。
    • @Triker “谁的类型更好”是基于意见甚至取决于场景。当您稍后需要使用该属性时(例如,您在包含 Post 对象的单元格上添加一个“喜欢”按钮。然后单击时,您可以在单元格内说 self.post.like())。另一方面,如果您有多种配置情况,那么最好使用这种方法;同时想象configureWith(person: Person)configureWith(happyThought: HappyThought)
    • 好的,它就像我想的那样工作,在这种情况下我使用了 func,但我会在另一个视图中使用你的方式,因为我重构了我的所有单元格。非常感谢您的帮助
    【解决方案2】:

    如果你想使用单一责任原则,你能做的最好的事情就是不要让UITableViewdelegate 到你的UIViewController 并有一个名为的新类YourTableViewController: UITableViewController 并将该类分配给情节提要中的 tableView。

    现在您的UIViewController 处理UIViewController 问题,UITableView 类处理UITableView 问题,与UITableViewCell 相关的所有事情都由CustomUITableViewCell 类处理。

    所以最好是在创建单元格之后调用configurateWithItem() 函数,但要从UITableView 自定义类中调用。

    通过遵循这条规则,您可以让您的 UIViewControllers 保持较小,并且您不会创建 Massive View Controllers。另外UITableViewControllers 可以在不同的UIViewControllers 中重复使用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多