gpt4 book ai didi

swift - 是否可以将 GeometryReader 的值传递给 @Observableobject

转载 作者:搜寻专家 更新时间:2023-11-01 06:50:39 25 4
gpt4 key购买 nike

我需要根据设备的尺寸和屏幕的宽度进行计算。

struct TranslatorView: View {

@ObservedObject var settings = TranslationViewModel(spacing: 4, charSize: 20)
var body: some View {
GeometryReader { geometry in
VStack{
TextField("Enter your name", text:self.$settings.translateString)
}

}
}
}

下面可以看到我的ObservableObject

class TranslationViewModel: ObservableObject {
@Published var translateString = ""
var ScreenSize : CGFloat = 0
var spacing : CGFloat = 4
var charSize : CGFloat = 20

init(spacing: CGFloat, charSize : CGFloat) {
self.spacing = spacing
self.charSize = charSize
}
}

我需要一种方法将 geometry.size.width 传递给我的 ScreenSize 属性,但不知道如何执行此操作。

最佳答案

最简单的方法是在 ObservableObject 中使用 setter 方法,它返回一个 EmptyView

import SwiftUI

struct TranslatorView: View {
@ObservedObject var settings = TranslationViewModel(spacing: 4, charSize: 20)
var body: some View {
GeometryReader { geometry in
VStack{
self.settings.passWidth(geometry: geometry)
TextField("Enter your name", text:self.$settings.translateString)
}

}
}
}

class TranslationViewModel: ObservableObject {
@Published var translateString = ""
var ScreenSize : CGFloat = 0
var spacing : CGFloat = 4
var charSize : CGFloat = 20

init(spacing: CGFloat, charSize : CGFloat) {
self.spacing = spacing
self.charSize = charSize
}

func passWidth(geometry: GeometryProxy) -> EmptyView {
self.ScreenSize = geometry.size.width
return EmptyView()
}
}

然后您可以围绕 GeometryReader 实现一个包装器,采用 content: () -> Content 和一个每次 GeometryReader 时都会执行的闭包在您可以更新任何内容的地方重新呈现。

import SwiftUI

struct TranslatorView: View {
@ObservedObject var settings = TranslationViewModel(spacing: 4, charSize: 20)
var body: some View {
GeometryReaderEasy(callback: {
self.settings.ScreenSize = $0.size.width
}) { geometry in
TextField("Enter your name", text:self.$settings.translateString)
}
}
}

struct GeometryReaderEasy<Content: View>: View {
var callback: (GeometryProxy) -> ()
var content: (GeometryProxy) -> (Content)

private func setGeometry(geometry: GeometryProxy) -> EmptyView {
callback(geometry)
return EmptyView()
}

var body: some View {
GeometryReader { geometry in
VStack{
self.setGeometry(geometry: geometry)
self.content(geometry)
}
}
}
}

关于swift - 是否可以将 GeometryReader 的值传递给 @Observableobject,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57597292/

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