gpt4 book ai didi

SwiftUI = ObservableObject 作为类的选择

转载 作者:行者123 更新时间:2023-12-03 22:41:22 24 4
gpt4 key购买 nike

使用 SwiftUI 我想按下一个按钮并让它切换用于过滤图像的类。

在 SwiftUI 中,按钮会执行如下操作:

@ObservedObject var currentFilter = FilterChoice()
...
var body: some View {..
Button(action:{
print("clicked")
var newFilter = Luminance()
self.currentFilter = newFilter
}) {
Text("Switch to Luminance Filter")
}
}

有一个 ObservableObject:
class FilterChoice: ObservableObject {  
@Published var filter = Luminance()
}

由 UIViewRepresentable 消耗:
struct FilteredPhotoView: UIViewRepresentable {
@ObservedObject var currentFilter = FilterChoice()

func makeUIView(context: Context) -> UIView {
...
// Code works and pulls correct filter but can not be changed
let className = currentFilter.filter
let filteredImage = testImage.filterWithOperation(className)
...
}...

目前,FilteredPhotoView 正在正确返回过滤后的图像。

但是如何使用 ObservedObject 来更改 CLASS?

换句话说, ObservedObject 在这里正确设置了类:
class FilterChoice: ObservableObject {
@Published var filter = Luminance()
}

但是如何更改这个 ObservableObject 以便在 SwiftUI 中更改该类?例如,我想单击一个按钮,过滤器应该更改为另一个类(例如:
new filter = ColorInversion()

我想我理解 ObservableObjects 是如何工作的,但我不能让它作为类的变化而不是像字符串值这样简单的东西来工作。

最佳答案

你真正需要的是一些泛型。

像这样声明一个协议(protocol):

protocol ImageFilter {

func apply(to image: UIImage) // for example
}

在此处声明所有过滤器将共享且将由 FilterChoice 使用的任何方法或属性。
接下来将所有过滤器声明为符合协议(protocol):
class Luminance: ImageFilter {
// implement all the methods and properties declared in the protocol
// for every filter
}

接下来声明您的 @Published过滤以符合该协议(protocol)
class FilterChoice: ObservableObject {
@Published var filter: ImageFilter

public init(filter: ImageFilter) {
self.filter = filter
}

// etc.
}

您将能够更改 @Published 使用的过滤器.

关于SwiftUI = ObservableObject 作为类的选择,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59034299/

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