带有 UIViewcontrollerRepresentable 的自定义 UIViewController 具有在 SwiftUI 中调用时崩溃或为零的 UITextView
Custom UIViewController with UIViewcontrollerRepresentable that has a UITextView that crashes or is nil when called in SwiftUI
我做了一个自定义的 UIViewController
叫 ViewControllerA
并且希望能够使用它所以我做了一个叫 ViewControllerARepresentable
的 UIViewControllerRepresentable
如下所示,问题虽然是当我在我的 SwiftUI 视图中调用 ViewControllerARepresentable
并为 stringToUpdateTextView
传递一个值时,ViewControllerA
表示 ViewControllerA
中的 htmlTextView(UITextView)
是 nil
我不确定为什么。
ViewControllerARepresentable(stringToUpdateTextView: "<html>Send some Html Text as string here</html>")
ViewControllerARepresentable
public struct ViewControllerARepresentable: UIViewControllerRepresentable {
var stringToUpdateTextView: String
public func makeUIViewController(context: Context) -> ViewControllerA {
let viewcontrollerA = ViewControllerA(testString: testingString)
return viewcontrollerA
}
public func updateUIViewController(_ uiViewController: ViewControllerA, context: Context) {}
}
ViewControllerA
open class ViewControllerA: UIViewController {
public var stringToUpdateTextView: String
override open func viewDidLoad() {
super.viewDidLoad()
htmlTextView.text = stringToUpdateTextView
}
@IBOutlet weak var htmlTextView: UITextView!
public init(testString: String) {
self.testString = testString
super.init(nibName: nil, bundle: nil)
}
required public init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
}
崩溃发生在 htmlTextView.text = stringToUpdateTextView
,表明 htmlTextView.text 为零,即使它是一个 IBOutlet。
如果在 viewDidAppear 或 viewDidLoad
中调用,对 htmlTextView 所做的任何更改(如背景颜色等)也会导致崩溃
在 makeUIViewController
中实例化视图控制器时,插座尚未初始化。
以下代码从情节提要中加载您的视图控制器,并更新 updateUIViewController
中的属性:
ViewController.swift
import UIKit
import SwiftUI
class ViewController: UIViewController {
@IBOutlet weak var htmlTextView: UITextView!
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
}
}
struct ViewControllerWrapper: UIViewControllerRepresentable {
typealias UIViewControllerType = ViewController
@Binding var text: String
func makeUIViewController(context: Context) -> ViewController {
let storyboard = UIStoryboard(name: "Main", bundle: nil)
guard let viewController = storyboard.instantiateViewController(
identifier: "ViewController") as? ViewController else {
fatalError("Cannot load from storyboard")
}
return viewController
}
func updateUIViewController(_ uiViewController: ViewController, context: Context) {
uiViewController.htmlTextView.text = text
}
}
struct ViewControllerPreview: PreviewProvider {
static var previews: some View {
ViewControllerWrapper(text: .constant("hello world!"))
}
}
SwiftUIView.swift
struct SwiftUIView: View {
@State var text = "Text"
var body: some View {
HStack {
TextField("Text:", text: $text)
ViewControllerWrapper(text: $text)
}
}
}
我做了一个自定义的 UIViewController
叫 ViewControllerA
并且希望能够使用它所以我做了一个叫 ViewControllerARepresentable
的 UIViewControllerRepresentable
如下所示,问题虽然是当我在我的 SwiftUI 视图中调用 ViewControllerARepresentable
并为 stringToUpdateTextView
传递一个值时,ViewControllerA
表示 ViewControllerA
中的 htmlTextView(UITextView)
是 nil
我不确定为什么。
ViewControllerARepresentable(stringToUpdateTextView: "<html>Send some Html Text as string here</html>")
ViewControllerARepresentable
public struct ViewControllerARepresentable: UIViewControllerRepresentable {
var stringToUpdateTextView: String
public func makeUIViewController(context: Context) -> ViewControllerA {
let viewcontrollerA = ViewControllerA(testString: testingString)
return viewcontrollerA
}
public func updateUIViewController(_ uiViewController: ViewControllerA, context: Context) {}
}
ViewControllerA
open class ViewControllerA: UIViewController {
public var stringToUpdateTextView: String
override open func viewDidLoad() {
super.viewDidLoad()
htmlTextView.text = stringToUpdateTextView
}
@IBOutlet weak var htmlTextView: UITextView!
public init(testString: String) {
self.testString = testString
super.init(nibName: nil, bundle: nil)
}
required public init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
}
崩溃发生在 htmlTextView.text = stringToUpdateTextView
,表明 htmlTextView.text 为零,即使它是一个 IBOutlet。
如果在 viewDidAppear 或 viewDidLoad
在 makeUIViewController
中实例化视图控制器时,插座尚未初始化。
以下代码从情节提要中加载您的视图控制器,并更新 updateUIViewController
中的属性:
ViewController.swift
import UIKit
import SwiftUI
class ViewController: UIViewController {
@IBOutlet weak var htmlTextView: UITextView!
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
}
}
struct ViewControllerWrapper: UIViewControllerRepresentable {
typealias UIViewControllerType = ViewController
@Binding var text: String
func makeUIViewController(context: Context) -> ViewController {
let storyboard = UIStoryboard(name: "Main", bundle: nil)
guard let viewController = storyboard.instantiateViewController(
identifier: "ViewController") as? ViewController else {
fatalError("Cannot load from storyboard")
}
return viewController
}
func updateUIViewController(_ uiViewController: ViewController, context: Context) {
uiViewController.htmlTextView.text = text
}
}
struct ViewControllerPreview: PreviewProvider {
static var previews: some View {
ViewControllerWrapper(text: .constant("hello world!"))
}
}
SwiftUIView.swift
struct SwiftUIView: View {
@State var text = "Text"
var body: some View {
HStack {
TextField("Text:", text: $text)
ViewControllerWrapper(text: $text)
}
}
}