SwiftUI = ObservableObject 作为类的选择

Posted

技术标签:

【中文标题】SwiftUI = ObservableObject 作为类的选择【英文标题】:SwiftUI = ObservableObject as Choice of Class 【发布时间】:2019-11-25 14:42:31 【问题描述】:

使用 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 的工作原理,但我无法让它作为类的变化而不是像字符串值这样简单的东西来工作。

【问题讨论】:

【参考方案1】:

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

像这样声明一个协议:

protocol ImageFilter 

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

在此处声明所有过滤器将共享且将由 FilterChoice 使用的任何方法或属性。 接下来将所有过滤器声明为符合协议:

class Luminance: ImageFilter 
    // implement all the methods and properties declared in the protocol
    // for every filter

接下来声明您的@Published 过滤器以符合该协议

class FilterChoice: ObservableObject 
    @Published var filter: ImageFilter

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

    // etc.

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

【讨论】:

谢谢 - 我会尽力实现这一点并返回接受作为答案。 如果您有任何问题,请告诉我。

以上是关于SwiftUI = ObservableObject 作为类的选择的主要内容,如果未能解决你的问题,请参考以下文章

swiftui 请求 渲染数据

SwiftUI 学习曲线

SwiftUI NavigationLink 如何到达另一个 SwiftUI 页面?

SwiftUI - 如何在 SwiftUI 中弹出到特定视图?

SwiftUI3.0将UIKit ViewController转化成 swiftUI的view

SwiftUI 五