gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-30 23:00:56 25 4
gpt4 key购买 nike

我是 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com