Swift 在类和结构视图之间共享数据绑定
比如说,,当我从API成功或失败中获取数据时,我想显示警报,但警报需要isPresented类型是Binding这就是为什么我想使用概念共享数据,因为类和视图之间的绑定是可能的,或者有另一种方法可以做,请提前帮助。Swift 在类和结构视图之间共享数据绑定,swift,swiftui,Swift,Swiftui,比如说,,当我从API成功或失败中获取数据时,我想显示警报,但警报需要isPresented类型是Binding这就是为什么我想使用概念共享数据,因为类和视图之间的绑定是可能的,或者有另一种方法可以做,请提前帮助。@Published属性适用于在类和视图之间共享数据observeObjects和Views 例如: class ViewModel : ObservableObject { struct APIError : Identifiable { var id = U
@Published
属性适用于在类和视图之间共享数据observeObject
s和View
s
例如:
class ViewModel : ObservableObject {
struct APIError : Identifiable {
var id = UUID()
var message : String
}
@Published var error : APIError?
func apiCall() {
DispatchQueue.main.asyncAfter(deadline: .now() + 1) {
self.error = APIError(message: "Error message")
}
}
}
struct ContentView : View {
@StateObject var viewModel = ViewModel()
var body: some View {
VStack {
Text("Hello, world!")
.alert(item: $viewModel.error) { item in
Alert(title: Text(item.message))
}
}
.onAppear {
viewModel.apiCall()
}
}
}
您也可以使用自定义绑定来实现这一点,但它有点混乱。上面的例子肯定是我的目标
class ViewModel : ObservableObject {
@Published var errorMessage : String?
var alertBinding : Binding<Bool> {
.init {
self.errorMessage != nil
} set: { newValue in
if !newValue { self.errorMessage = nil }
}
}
func apiCall() {
DispatchQueue.main.asyncAfter(deadline: .now() + 1) {
self.errorMessage = "Error!"
}
}
}
struct ContentView : View {
@StateObject var viewModel = ViewModel()
var body: some View {
VStack {
Text("Hello, world!")
.alert(isPresented: viewModel.alertBinding) {
Alert(title: Text(viewModel.errorMessage ?? "(unknown)"))
}
}
.onAppear {
viewModel.apiCall()
}
}
}
类视图模型:ObserveObject{
@发布的var错误消息:字符串?
var-alertBinding:Binding{
.init{
self.errorMessage!=nil
}集合:{newValue in
如果!newValue{self.errorMessage=nil}
}
}
func apiCall(){
DispatchQueue.main.asyncAfter(截止日期:.now()+1){
self.errorMessage=“错误!”
}
}
}
结构ContentView:View{
@StateObject变量viewModel=viewModel()
var body:一些观点{
VStack{
文本(“你好,世界!”)
.alert(显示:viewModel.alertBinding){
警报(标题:文本(viewModel.errorMessage??(未知)”)
}
}
奥纳佩尔先生{
viewModel.apiCall()
}
}
}
是的,一切都完成了,先生