美文网首页
SwiftUI获取UIKit的回调结果

SwiftUI获取UIKit的回调结果

作者: 萧修 | 来源:发表于2023-11-23 12:19 被阅读0次

功能:文本显示未登录,登录之后,文本显示登录。

基本样式

struct ContentView: View {
    
    @State var isLogin: Bool = false
    @State var isPresented: Bool = false
    
    var body: some View {
        Button(action: {
            self.isPresented = true
        }, label: {
            Text("\(isLogin ? "已登录" :"未登录")")
        })
        .sheet(isPresented: $isPresented, content: {
            SUBridgLoginView(isLogin: $isLogin)
        })
    }
}

让SwiftUI能够访问UIkit的控制器,需要创建遵循UIViewControllerRepresentable的结构体,此结构体的功能做桥接,完成一部分业务逻辑。命名,SwiftUI简写SU + Bridg+ + 业务名 + 控制器Vc

结构体中,我们定义@Binding属性包装器,用于绑定外界传来的值

UIViewControllerRepresentable必须实现的协议

makeUIViewController:用于UIKit控制器的返回
updateUIViewController:用于SwiftUI和UIKit的相互通信

struct SUBridgLoginViewVc: UIViewControllerRepresentable {
    
    @Binding var isLogin: Bool
    
    let vc = RSSMSLoginController()//UIkit的控制器
    
    //用于创建视图控制器
    func makeUIViewController(context: Context) -> some UIViewController {
        return vc
    }
    
    //用于某些SwiftUI更新 <==> 我们更新视图控制器
    func updateUIViewController(_ uiViewController: UIViewControllerType, context: Context) {
        //
        vc.loginStateClosure = { state in
            isLogin = state
        }
    }
    
    func makeCoordinator() -> SULoginCoordintor {
        return SULoginCoordintor()
    }
    
    //定义登录协调器
    class SULoginCoordintor: NSObject { // works as delegate
        
    }
}

桥接控制器写完毕之后,我们需要SwiftUI的UI,因为SwiftUI是视图相关,因此还需要为桥接控制器创建对应的SwiftUI视图,我们称之桥接视图,前缀为SUBridg + 业务 + View

struct SUBridgLoginView: View {

    //登录状态
    @Binding var isLogin: Bool
    
    var body: some View{
        SUBridgLoginView(isLogin: $isLogin)
            .edgesIgnoringSafeArea(.all)
  
    }
}

现在就可以将SUBridgLoginView放在我们熟悉的SwiftUI展示出来。

涉及的知识点有@State@Binding

相关文章

网友评论

      本文标题:SwiftUI获取UIKit的回调结果

      本文链接:https://www.haomeiwen.com/subject/jcqgwdtx.html