如何知道 UIKit 视图控制器中的 swiftUI 事件? ||如何提供 swiftUI 和 uikit 之间的通信

Posted

技术标签:

【中文标题】如何知道 UIKit 视图控制器中的 swiftUI 事件? ||如何提供 swiftUI 和 uikit 之间的通信【英文标题】:How to know swiftUI event in UIKit view controller? || How to provide communication between swiftUI and uikit 【发布时间】:2022-01-12 09:40:37 【问题描述】:

我是 swiftUI 的新手。我想在我当前的 UIkit 项目中添加 swiftUI 视图,为此我创建了一个我现在卡在其中的演示。

这是我的 ViewController 代码:


import UIKit
import SwiftUI

class ViewController: UIViewController 
    
    
    @IBOutlet weak var stepperContenerView: UIView!
    @IBOutlet weak var btn:UIButton!
    
    
    lazy var stepView = StepperView(intialCount: 1)
    lazy var swiftUIHostingView = UIHostingController(rootView: stepView)
    
    override func viewDidLoad() 
        super.viewDidLoad()
        
        stepperContenerView.addSubview(swiftUIHostingView.view)
        addChild(swiftUIHostingView)
//        stepView.delegate = self

        swiftUIHostingView.view.frame = stepperContenerView.bounds
        stepperContenerView.addConstrained(subview: swiftUIHostingView.view)
        swiftUIHostingView.didMove(toParent: self)
    
    @IBAction func onClickBtn(_ sender: UIButton) 
        let alert = UIAlertController(title: "Stepper count", message: "Current value : \(stepView.getCount())", preferredStyle: UIAlertController.Style.alert)
        alert.addAction(UIAlertAction(title: "ok", style: UIAlertAction.Style.default, handler: nil))
        self.present(alert, animated: true, completion: nil)
     

 
//extension ViewController:OnClickStepperButton 
//    func updateCount(count: Int) 
//        print("Test")
//        lbl.text = "Stepper count is - \(count)"
//    
//


这是我的 swiftUI 步进视图代码:-


import SwiftUI

protocol OnClickStepperButton 
    func updateCount(count:Int)


struct StepperView: View 
    @State private var count:Int = 1
    var delegate:OnClickStepperButton?
    
    init(intialCount:Int)
        self.count = intialCount
    
    
    var body: some View 
        HStack(alignment: .center, spacing: 10) 
            Button("+", action: 
                count += 1
                print(count)
//                delegate?.updateCount(count: count)
            )
            
            Text("\(count)")
                .frame(minWidth: 40,minHeight: 40)
                .background(Color.white)
                .foregroundColor(.black)
                .scaledToFill()
                
            Button("-", action: 
                if count > 1 
                    count -= 1
                    print(count)
                
//                delegate?.updateCount(count: count)
            )
            
        
        .font(.system(size: 22, weight: .medium, design: .serif))
        .frame(minWidth: 120, minHeight: 40, alignment: .center)
        .background(Color.blue)
        .foregroundColor(Color.white)
        .cornerRadius(20)
    
    
    public func getCount() -> Int 
        count
    



struct Stepper_Previews: PreviewProvider 
    static var previews: some View 
        StepperView(intialCount: 1)
            .previewLayout(.fixed(width: 300, height: 70))
    


委托既没有调用,我也没有在单击按钮时获得更新值。 (代表们发表评论的目的是为了强调其不起作用,请取消评论以进行检查)。

【问题讨论】:

我可能会错过它,但您的委托永远不会被设置。删除问号以确保您获得初始值 它现在可以工作了,谢谢???? 你能告诉我当我点击 uiviewcontroller 中的按钮(btw)时如何获取更新计数值 假设您有一个未显示的标签 IBOutlet,您现在拥有灰色代码的方式应该可以工作。 目前我没有使用它。我添加它只是为了演示目的。 【参考方案1】:

delegate 变量永远不会按原样设置。

您需要删除 ?从 SwiftUI 视图中的变量,因此您必须在初始化时提供一个值。

另外,删除自定义初始化程序。

【讨论】:

以上是关于如何知道 UIKit 视图控制器中的 swiftUI 事件? ||如何提供 swiftUI 和 uikit 之间的通信的主要内容,如果未能解决你的问题,请参考以下文章

如何访问不同视图控制器中的属性?

如何使用自动布局 beta 7 UIKIT 修复 xcode 11 中可滚动内容大小的歧义

你如何在 UIKit 视图控制器和它呈现的 SwiftUI 视图之间共享数据模型?

我是不是必须保留放入 UIKit 应用程序视图中的所有值的副本?

UIKit 中的大弹出视图叫啥?

如何从swiftui视图调用uikit viewcontroller方法