【问题标题】:SwiftUI = ObservableObject as Choice of ClassSwiftUI = ObservableObject 作为类的选择
【发布时间】: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 的工作原理,但我无法让它作为类的变化而不是像字符串值这样简单的东西来工作。

【问题讨论】:

    标签: swift uikit swiftui combine


    【解决方案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 使用的过滤器。

    【讨论】:

    • 谢谢 - 我会尽力实现这一点并返回接受作为答案。
    • 如果您有任何问题,请告诉我。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-11
    • 1970-01-01
    • 2020-11-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多