在 SwiftUI 中使用自定义 UIKit 类

Using Custom UIKit Classes in SwiftUI

我已经为 UIKit 对象创建了自己的自定义 类。现在我想在 SwiftUI 中使用相同的 类,我怎样才能实现它,需要付出多少努力。

此外,如果我想要,我需要在 swift UI 中写相同的 类。

例如,我有自定义 UILable 子类 WMLabel。

    class WMLabel: UILabel {
    var myproperty: String = "" {
        didSet {
            self.text = myproperty
        }
    }
}

那么我如何在 swiftUI 中使用 WMLabel?

我已尝试 ObserverableObjectUIViewRepresentable,但无法访问属性。

转换您的所有自定义项 类 并与它们交互将是一件很麻烦的事情(如果您有一些自定义项的话)。你最终会使用一个叫做 UIViewRepresentable 的东西,它需要很多东西,其中最烦人的是协调器。您最好将 类 重写为 SwiftUI 版本。这是 Apple 关于将 SwiftUI 与 UIKit 接口的文档:https://developer.apple.com/tutorials/swiftui/interfacing-with-uikit

这是一个将 UILabel 转换为 SwiftUI 的示例,具有可访问的属性。

转换示例

struct WMLabel: View {
    var myProperty: String
    var body: some View {
        Text(myProperty)
    }
}

用法示例

struct Example: View {
    var body: some View {
        WMLabel(myProperty: "Hello World!")
    }
}

如您所见,将某些内容转换为 SwiftUI 涉及的代码很少,如果您开始使用 UIViewRepresentable,则必须开始使用协调器和许多其他接口方法才能使其正常工作。有时它是必需的,但在大多数情况下我会尽量避免它。

你绝对可以使用你的 UIKit 类。要获得对属性的基本访问权限,您需要查看 makeUIView,它在首次创建视图时发生,并且 updateUIVew.

使用您的示例代码:

class WMLabel: UILabel {
    var myproperty: String = "" {
        didSet {
            self.text = myproperty
        }
    }
}

struct WMLabelRepresented: UIViewRepresentable {
    var text : String
    
    func makeUIView(context: Context) -> WMLabel {
        return WMLabel()
    }
    
    func updateUIView(_ uiView: WMLabel, context: Context) {
        uiView.myproperty = text
    }
}

struct ContentView : View {
    var body: some View {
        WMLabelRepresented(text: "My text")
    }
}

如果有些东西无法以声明方式表达,您将需要查看协调器,正如您所提到的,可能 ObservableObject 将数据命令式地传递给您的视图,但通常您会发现以声明方式表达大多数事物的方法。

如果你想要一个更复杂的命令式通信的例子,这里有几个指向我的另一个答案的链接: