• 赚钱入口【需求资源】限时招募流量主、渠道主,站长合作;【合作模式】CPS长期分成,一次推广永久有收益。主动打款,不扣量;

如何使用iOS14中的Modern cell configuration

iOS rin, seun 6个月前 (08-01) 129次浏览 0个评论

这里的关键(我不认为Apple在视频中完全阐明了这一点)是,这些单元格配置的工作方式是从字面上提取单元格contentView并将其替换为配置提供的视图作为输出其makeContentView

因此,您要做的就是手工构建整个内容视图,运行时将其放入您的单元格中。

例如,我们需要提供我们自己的采用UIContentConfiguration的配置类型,以便我们可以定义自己的属性。它还必须实现makeContentView()updated(for:)。因此,假设单元格中要显示四个文本:

struct Configuration : UIContentConfiguration {
    let text1: String
    let text2: String
    let text3: String
    let text4: String
    func makeContentView() -> UIView & UIContentView {
        let c = MyContentView(configuration: self)
        return c
    }
    func updated(for state: UIConfigurationState) -> MyCell.Configuration {
        return self
    }
}

现实当中我们可能会通过更改返回配置的某个版本并更改某些属性来响应状态更改,但是在这种情况下无需执行任何操作,因此我们只需返回即可self

我们假定MyContentView是存在的,MyContentView是采用UIContentView的UIView子类,这意味着它具有configuration属性。这是我们配置视图的子视图并应用配置的地方。在这种情况下,应用配置意味着只需设置四个标签的文本。我将把这两个任务分开:

class MyContentView: UIView, UIContentView {
    var configuration: UIContentConfiguration {
        didSet {
            self.configure()
        }
    }
    private let lab1 = UILabel()
    private let lab2 = UILabel()
    private let lab3 = UILabel()
    private let lab4 = UILabel()
    init(configuration: UIContentConfiguration) {
        self.configuration = configuration
        super.init(frame: .zero)
        // ... configure the subviews ...
        // ... and add them as subviews to self ...
        self.configure()
    }
    required init?(coder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
    private func configure() {
        guard let config = self.configuration as? Configuration else { return }
        self.lab1.text = config.text1
        self.lab2.text = config.text2
        self.lab3.text = config.text3
        self.lab4.text = config.text4
    }
}<code></code>

您可以看到该体系结构的要点。如果在将来的某个时刻为我们分配了一个new configuration,则只需调用configure即可再次设置标签的文本,而无需自己重建子视图。在现实生活中,我们可以通过检查传入的配置来进一步提高效率。如果与当前配置相同,则无需self.configure()再次调用。

结果是我们现在可以在tableView(_:cellForRowAt:)实现中这样说:

override func tableView(_ tableView: UITableView, 
    cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(
            withIdentifier: self.cellID, for: indexPath) as! MyCell
        let config = MyCell.Configuration(
            text1: "Harpo",
            text2: "Groucho",
            text3: "Chico",
            text4: "Zeppo"
        )
        cell.contentConfiguration = config
        return cell
}

所有这些都很聪明,但是不幸的是,内容视图界面似乎必须用代码创建-我们无法从nib加载现成的cell,因为从该nib加载的内容视图及其所有子视图,将由我们的makeContentView实现返回的内容视图替换。因此,Apple的配置体系结构不能与在storyboard或.xib文件中设计的单元一起使用,遗憾的是还没有什么办法能够解决。

喜欢 (0)
发表我的评论
取消评论
表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址