【问题标题】:Dismiss button in SwiftUI modal called from UIKit从 UIKit 调用的 SwiftUI 模式中的关闭按钮
【发布时间】:2020-10-06 11:30:56
【问题描述】:

我有一个从 UIKit 主视图调用的 SwiftUI 模态视图。我想在我的模态视图中添加一个关闭按钮。正如我所知,UIKit 中没有 @State 变量,因此我正在创建一个单独的 SwiftUI 视图来存储我的 @State 变量,但由于某种原因它无法正常工作。我应该如何解决这个问题?

我在主 ViewController 中的代码:

var hack = StateInUIKitHack()
hack.modalIsPresented = true
let vc = UIHostingController(rootView: MoodCardView(isPresented: hack.$modalIsPresented, entryIndex: entryIndex, note: moodEntries[entryIndex].note ?? ""))
self.present(vc, animated: true, completion: nil)

StateInUIKitHack 结构:

struct stateInUIKitHack: View {
     @State var modalIsPresented = false

    var body: some View {
        Text("Hello, World!")
    }
} 

在 MoodCardView.swift 我有:

 @Binding var isPresented: Bool

如果我从另一个 SwiftUI 视图创建我的模态表,它会以经典方式关闭它,但我需要从 UIKit 视图创建它。

【问题讨论】:

    标签: ios swift iphone uikit swiftui


    【解决方案1】:

    这是一个可能的方法的演示。使用 Xcode 11.4 / Playground 测试

    完整的游乐场代码:

    import UIKit
    import SwiftUI
    import PlaygroundSupport
    
    class ViewModel {
        var closeAction: () -> Void = {}
    }
    
    struct ModalView: View {
        var vm: ViewModel
    
        var body: some View {
            VStack {
                Text("I'm SwfitUI")
                Button("CloseMe") {
                    self.vm.closeAction()
                }
            }
        }
    }
    
    class MyViewController : UIViewController {
    
        override func loadView() {
            let view = UIView()
            view.backgroundColor = .white
    
            let button = UIButton(type: .roundedRect)
            button.setTitle("ShowIt", for: .normal)
            button.addTarget(self, action: #selector(MyViewController.showModal(_:)), for: .touchDown)
    
            view.addSubview(button)
    
            button.translatesAutoresizingMaskIntoConstraints = false
            button.centerXAnchor.constraint(equalTo: view.centerXAnchor).isActive = true
            button.centerYAnchor.constraint(equalTo: view.centerYAnchor).isActive = true
            self.view = view
        }
    
        @objc func showModal(_ : Any?) {
            let bridge = ViewModel()
            let vc = UIHostingController(rootView: ModalView(vm: bridge))
            bridge.closeAction = { [weak vc] in
                vc?.dismiss(animated: true)
            }
            self.present(vc, animated: true, completion: nil)
        }
    }
    // Present the view controller in the Live View window
    PlaygroundPage.current.liveView = MyViewController()
    

    【讨论】:

      猜你喜欢
      • 2021-09-25
      • 2020-09-17
      • 2022-01-22
      • 2020-10-07
      • 2020-10-05
      • 1970-01-01
      • 2020-05-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多