首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >协议中的UI元素?

协议中的UI元素?
EN

Stack Overflow用户
提问于 2020-10-25 11:23:39
回答 3查看 264关注 0票数 1

我的应用程序有大约6个基于界面构建器的视图,它们包含相同的UI元素,由同一个ViewModel启动,但是所有视图都是不同的类(有些是UICollectionViewCell,有些是UITableViewCell,有些是UIViewController视图的一部分),它们看起来完全不同,有不同的约束和总体设计。

我发现在每个视图中将UI元素绑定到ViewModel中有很多代码重复,并且我试图找到一种方法来清理代码。

由于应用程序是protocol-oriented,,所以我想出了以下解决方案:

代码语言:javascript
复制
protocol Common {
    var someTitleLabel: UILabel! { get set }
    var someImageView: UIImageView! { get set }
    func configure(viewModel: ViewModel?)
}

extension Common {
    func configure(viewModel: ViewModel?) {
        guard let viewModel = viewModel else { return }
        someTitleLabel?.text = viewModel.title
        someImageView?.image = viewModel.image
}

以及每一种观点的实施情况:

代码语言:javascript
复制
class someClass: UICollectionViewCell, Common {

    @IBOutlet weak var someTitleLabel: UILabel!
    @IBOutlet weak var someImageView: UIImageView!

    override func awakeFromNib() {
        super.awakeFromNib()
    }
代码语言:javascript
复制
cell.configure(viewModel: viewModel)

好的是它起作用了。

糟糕的是,我从未在我所从事的任何应用程序中见过这样的实现。

所以,主要的问题是--这是解决这类问题的好办法吗?在这种情况下,我应该放弃面向协议的结构,而使用面向对象( OOP )吗?由同一个ViewModel配置的“泛型”接口构建器视图的最佳实践是什么?

EN

回答 3

Stack Overflow用户

发布于 2020-10-25 12:19:39

您可以使用继承的权力来实现相同的结果。

代码语言:javascript
复制
YourBaseCell: UICollectionViewCell {

        @IBOutlet weak var someTitleLabel: UILabel!
        @IBOutlet weak var someImageView: UIImageView!

        func configure(viewModel: ViewModel?) {
            guard let viewModel = viewModel else { return }
            someTitleLabel?.text = viewModel.title
            someImageView?.image = viewModel.image
        }
}

然后连接到每个xib文件的基类。

票数 0
EN

Stack Overflow用户

发布于 2020-10-25 14:35:53

最好是让您的具体类控制配置方法。

代码语言:javascript
复制
protocol Common {
    var someTitleLabel: UILabel! { get set }
    var someImageView: UIImageView! { get set }
    func configure(viewModel: ViewModel)

}

extension Common {
    func configureCommonProperties(viewModel: ViewModel) {
        guard let viewModel = viewModel else { return }
        someTitleLabel?.text = viewModel.title
        someImageView?.image = viewModel.image
    }
}

class someClass: UICollectionViewCell, Common {

    @IBOutlet weak var someTitleLabel: UILabel!
    @IBOutlet weak var someImageView: UIImageView!

    func configure(viewModel: ViewModel) {
        configureCommonProperties(viewModel: viewModel)
    }
    
}
票数 0
EN

Stack Overflow用户

发布于 2020-10-26 08:39:28

YourBaseCell:

代码语言:javascript
复制
UICollectionViewCell {

    @IBOutlet weak var someTitleLabel: UILabel!
    @IBOutlet weak var someImageView: UIImageView!

    func configure(viewModel: ViewModel?) {
        guard let viewModel = viewModel else { return }
        someTitleLabel?.text = viewModel.title
        someImageView?.image = viewModel.image
    }
}

与从单元格继承不同,您可以从UIView继承并使用这个新类作为自定义视图,这样构建单元格ui就没有问题了,它解决了“将UI元素绑定到ViewModel中的代码复制”

你可以做一些这样的事情:

代码语言:javascript
复制
CellContenierView: UIView {

    @IBOutlet weak var someTitleLabel: UILabel!
    @IBOutlet weak var someImageView: UIImageView!

    func configure(viewModel: ViewModel?) {
        guard let viewModel = viewModel else { return }
        someTitleLabel?.text = viewModel.title
        someImageView?.image = viewModel.image
    }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64523137

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档