功能:文本显示未登录,登录之后,文本显示登录。
基本样式
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
网友评论