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的相互调用了