在 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?
我已尝试 ObserverableObject
和 UIViewRepresentable
,但无法访问属性。
转换您的所有自定义项 类 并与它们交互将是一件很麻烦的事情(如果您有一些自定义项的话)。你最终会使用一个叫做 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
将数据命令式地传递给您的视图,但通常您会发现以声明方式表达大多数事物的方法。
如果你想要一个更复杂的命令式通信的例子,这里有几个指向我的另一个答案的链接:
我已经为 UIKit 对象创建了自己的自定义 类。现在我想在 SwiftUI 中使用相同的 类,我怎样才能实现它,需要付出多少努力。
此外,如果我想要,我需要在 swift UI 中写相同的 类。
例如,我有自定义 UILable 子类 WMLabel。
class WMLabel: UILabel {
var myproperty: String = "" {
didSet {
self.text = myproperty
}
}
}
那么我如何在 swiftUI 中使用 WMLabel?
我已尝试 ObserverableObject
和 UIViewRepresentable
,但无法访问属性。
转换您的所有自定义项 类 并与它们交互将是一件很麻烦的事情(如果您有一些自定义项的话)。你最终会使用一个叫做 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
将数据命令式地传递给您的视图,但通常您会发现以声明方式表达大多数事物的方法。
如果你想要一个更复杂的命令式通信的例子,这里有几个指向我的另一个答案的链接: