首页 > 其他分享 >SwiftUI 与ObjC混编和消息传参

SwiftUI 与ObjC混编和消息传参

时间:2022-11-10 16:59:51浏览次数:29  
标签:传参 文件 vc Swift OC ObjC SwiftUI SwiftToObjcVC

SwiftUI同OC混编

OC打开SwiftUI页面

1、创建OC主工程
2、添加Swift文件,此时会弹窗提醒自动创建一个桥接文件,点击确定,创建文件

3、在SwiftUI文件中 创建被oc调用的控制器和方法 需要注意:注意Swift类和被调用的方法要使用@objc来修饰

@objc
class TestViewController: NSObject{
    @objc func createTestViewController() -> UIViewController{
        let vc = UIHostingController(rootView: SwiftUIView());
        vc.hidesBottomBarWhenPushed = true
        return vc
    }
}

4、创建桥接文件后,当我们创建了swift文件,就会自动生成一个"工程名称-Swift.h"的文件,然后手动在oc需要调用swift的控制器里引入这个头文件
比如 我的demo叫ObjcMixSwiftUI,那么就会自动生成一个ObjcMixSwiftUI-Swift.h的文件,这个文件导入时有时候不会自动提醒,手动填进去就行了
按住ObjcMixSwiftUI-Swift.h进去到这个文件中,发现刚刚创建的TestViewController已经被转换成了对应的oc代码,接下来就可以向访问oc代码一样去调用该控制器了

    UIViewController *vc = [[TestViewController alloc] createTestViewController];
    [self.navigationController pushViewController:vc animated:YES];

需要注意的是"工程名称-Swift.h"这个文件如果你发现输入后找不到文件时,这个时候定位到target->build settings->搜索Interface Header看看搜索到的文件是否是你引入的-Swift.h文件,如果不是或者有中文的,可以修改名称后重新导入
5、点击按钮发现此时就可以正常的打开SwiftUI布局好的页面了
ObjcMixSwiftUI-Bridging-Header.h

#import "SwiftToObjcVC.h"

SwiftUI打开OC页面

1、在主工程中创建OC文件SwiftToObjcVC,并且在桥接的.h文件中引入该文件,这样swift就可以找到oc页面
2、在swiftUI页面重新创建一个View并且继承UIViewControllerRepresentable协议,重新makeUIViewController 和 updateUIViewController方法,并且在makeUIViewController方法中创建刚刚创建OC控制器SwiftToObjcVC

struct MySwiftView: UIViewControllerRepresentable {
    func makeUIViewController(context: Context) -> SwiftToObjcVC {
        let vc = SwiftToObjcVC()
        return vc
    }
    
    func updateUIViewController(_ uiViewController: SwiftToObjcVC, context: UIViewControllerRepresentableContext<MySwiftView>) {
        
    }
}

3、在需要地方引入MySwiftView就可以打开SwiftToObjcVC页面了

struct SwiftUIView: View {
    
    @Environment(\.presentationMode) var presentationMode: Binding<PresentationMode>
    @State var isPresented: Bool = false
    var body: some View {
        NavigationView{
            List{
                ForEach(0..<100) { index in
                    NavigationLink(destination: Text("详情页:\(index)")) {
                        Text("\(index)")
                            .frame(height: 40)
                    }
                    
                }
            }
            .navigationTitle("标题")
            .navigationBarBackButtonHidden(false)
            .toolbar {
                ToolbarItem(placement: .navigationBarLeading) {
                    Button("返回") {
                        self.presentationMode.wrappedValue.dismiss()
                    }
                }
                
                ToolbarItem(placement: .navigationBarTrailing) {
                    Button("返回值:\(value)") {}
                }
                
                
                ToolbarItem(placement: .bottomBar) {
                    Button("点击打开OC页面") {
                        isPresented = true
                    }
                }
            }
            .sheet(isPresented: $isPresented) {
                MySwiftView()
            }
        }
    }
}

4、此时就实现了oc和swiftui的相互调用了

SwiftUI同OC传参

标签:传参,文件,vc,Swift,OC,ObjC,SwiftUI,SwiftToObjcVC
From: https://www.cnblogs.com/qqcc1388/p/16877597.html

相关文章