ios - 从 View 模型结构中获取值

标签 ios swift

我是 swift 的新手。目前,我正在尝试在 Swift 4 中以编程方式创建 View 屏幕。该屏幕应该有许多图像和文本标签。我创建了一个 View 模型,其中包含几个已声明的图像和字符串的结构。

我的 View 模型中的结构设置:

import Foundation
import UIKit

struct ShareUIModel {

    let heroImage: UIImage
    let secondHeroImage: UIImage
    let longHeroText: String
    let shortHeroText: String

}

extension ShareUIModel {

    static func testObject() -> ShareUIModel {
        let heroImageImage = placeholderImage
        let secondHeroImageImage = placeholderImage
        let longHeroTextText = "long words"
        let shortHeroTextText = "short words"
        return ShareUIModel(heroImage: heroImageImage, secondHeroImageImage: secondHeroImage, longHeroText: longHeroTextText, shortHeroText: shortHeroTextText)
    }
}

问题:如何在 View Controller 中创建 ShareUIModel 实例并访问值?

最佳答案

通常,您可以通过多种方式将 MVM 对象应用于它的 View 。 Personnaly,我建议使用 convenience 初始化程序,或带有所谓的 didSet 值观察器的自定义变量。 Didset 观察者在应用其参数时被调用,而不修改存储的值。

因此给定一个可以处理您的模型的 uivew 子类:

class ShareUIView : UIView {


    var model : ShareUIModel? {
        didSet {
            guard let mode = model else { return }
            applyModel(mode)
        }
    }

    let heroImage = UIImageView()
    let secondHeroImage = UIImageView()
    let longHeroLabel = UILabel()
    let shortHeroLabel = UILabel()

    //Initializer
    convenience init(model: ShareUIModel) {
        self.init()
        self.addSubview(heroImage)
        self.addSubview(secondHeroImage)
        self.addSubview(longHeroLabel)
        self.addSubview(shortHeroLabel)
        self.model = model
    }

    private func applyModel(_ model: ShareUIModel) {
        self.heroImage.image = model.heroImage
        self.secondHeroImage.image = model.heroImage
        self.longHeroLabel.text = model.longHeroText
        self.shortHeroLabel.text = model.shortHeroText
    }

    override func draw(_ rect: CGRect) {
        super.draw(rect)
        buildYourComponents()
    }

    func buildYourComponents() {
        //This will be called whenever ShareUIView's size or layout is applied.
        //code to build out your labels and imageViews
    }

}

所以从这里开始,您可以通过初始化将它应用到您的 UIViewControllerview 上:

class Controller : UIViewController {


    override func viewDidLoad() {
        super.viewDidLoad()

        let shareview = ShareUIView(model: ShareUIModel.testObject())
        view.addSubview(shareview)
        shareview.frame = //whatever you want here..
    }

}

此方法意味着您必须在之后设置大小。

或者,您可以先构建 ShareView,然后通过将模型应用到 ShareView 的模型参数上来应用模型对象(例如,来自用户的选择,或来自网络任务) .然而,这需要您对它有一个强引用,就像将它初始化到您的 Controller 类中一样:

class Controller : UIViewController {

    var shareView : ShareUIView = { //Initialized as a parameter of Controller instead
        var v = ShareUIView()
        return v
    }()

    override func viewDidLoad() {
        super.viewDidLoad()
        view.addSubview(shareView) //You add the view
        shareView.frame = .zero//you build the view - .zero is just an example here.
    }

    func applyTheModelFromWherever() {
        shareView.model = ShareUIModel.testObject() //you apply the model object.
    }

}

从这里您应该有足够的示例来发挥创意,了解如何使用模型对象内容更新 MVVM View 。然后,您还可以创建方法来清除内容、关闭内容等,具体取决于 View 本身的用例。

关于ios - 从 View 模型结构中获取值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47274840/

相关文章:

swift - 具有类型别名的协议(protocol)不能符合 AnyObject 类型?

ios - Swift 3 时间变化时如何执行操作

php - 从 PHP 脚本接收 'json_encode' 时 Swift JSON 出错。没有它也能正常工作

ios - 从 mainBundle 加载

ios - 如何在标题中制作搜索栏?

ios - 为什么 OAuth 重定向在 iOS 13 中不起作用,但在 iOS 12 中却起作用?

android - 如何知道 HTML5 中的音频路径(Chrome 浏览器 - iOS/Android)

javascript - 将事件监听器添加到React Native ART组件

ios - 为什么 UINavigation 中的 UILabel 不居中

swift - 如何在没有 Storyboard 的情况下在 Swift 中以编程方式调整弹出窗口的大小?