我正在尝试将SwiftUI View
在UIKit中使用。目前,我使用Binding<Bool>
来关闭/展示 DetailView
。以下是可用的代码:
struct ContentView: View {
@State var presentingModal = false
var body: some View {
Button("Present") { self.presentingModal = true } /// tap button to present detail sheet
.sheet(isPresented: $presentingModal) {
DetailView(isPresentedBinding: $presentingModal) /// pass in the binding
}
}
}
struct DetailView: View {
var isPresented: Binding<Bool>? /// it's an optional so I do this instead of `@Binding var isPresented: Bool`
var body: some View {
Button("Done") { isPresented?.wrappedValue = false } /// tap the "Done" button to dismiss
}
}
当您按下“完成”按钮时,它会将isPresented
设置为false,从而关闭该表。现在我想从UIViewController
中呈现DetailView
。这是我到目前为止的代码:class ViewController: UIViewController {
@IBAction func presentButtonPressed(_ sender: Any) {
let detailViewController = DetailView_UIKit()
self.present(detailViewController, animated: true, completion: nil)
}
}
/// wrap DetailView in a ViewController so it's easier to present
class DetailView_UIKit: UIViewController {
init() {
super.init(nibName: nil, bundle: nil)
}
required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
override func loadView() {
view = UIView()
/// Host the `DetailView`
let detailViewController = UIHostingController(
rootView: DetailView() /// I need to pass a Binding in here!
)
self.addChild(detailViewController)
view.addSubview(detailViewController.view)
detailViewController.view.frame = view.bounds
detailViewController.view.autoresizingMask = [.flexibleWidth, .flexibleHeight]
detailViewController.didMove(toParent: self)
}
/// I want to call this function too
func dismissThisViewController() {
self.dismiss(animated: true, completion: nil)
}
}
这个代码能够运行,但是“完成”按钮没有任何反应......Binding
仍然为nil,因为我还没有将其分配给任何东西。我该如何在DetailView_UIKit
内创建某种@State
属性,以便我可以将其传递到DetailView
中?当该属性设置为false
时,我想调用dismissThisViewController
。或者创建一个@State
属性不是正确的方法,我不确定。
SwiftUI流程:
ContentView (present)→ DetailView
◟________________◞
Binding
UIKit 流程:
ViewController (present)→ DetailView_UIKit → DetailView
◟________________◞
Binding? Not sure what to put
感谢您的帮助!
present..
方法呈现的UIKit控制器,你必须使用相应的UIKitdismiss...
方法。 - Asperi