ios - 如何使用可绑定(bind)对象(EnvironmentObject)?

标签 ios swift swiftui

我正在使用新的 SwiftUI。我有一个 UserUpdate 类,它是一个 Bindable Object,我想修改这些变量并自动更新 UI。

我成功更新了这些值,但是当我更改 UserUpdate 类中的变量时,我的 UI 结构中的 View 没有更新。

当我修改 UI 结构本身中的 @EnviromentObject 变量时,它发生变化。

这是我的可绑定(bind)对象类:

final class UserUpdate: BindableObject {
    let didChange = PassthroughSubject<Any, Never>()

    var allUsers: [User] = [] {
        didSet {
            print(allUsers)
            didChange.send(allUsers)
        }
    }

    var firstName: String = "" {
        didSet {
            didChange.send(firstName)
        }
    }

    var lastName: String = "" {
        didSet {
            didChange.send(lastName)
        }
    }
}

那是我的用户类:

struct User: Identifiable {
    let id: Int
    let firstName, lastName: String
}

这是我配置 UI 的方式:

struct ContentView : View {
    @EnvironmentObject var bindableUser: UserUpdate

    var body: some View {
        NavigationView {
            VStack(alignment: .leading) {
                Text("All Users:").bold().padding(.leading, 10)
                List {
                    ForEach(bindableUser.allUsers) { user in
                        Text("\(user.firstName) \(user.lastName)")
                    }
                }
            }
        }
    }
}

这里我修改了UserUpdate中的变量:

class TestBind {
    static let instance = TestBind()

    let userUpdate = UserUpdate()

    func bind() {
        let user = User(id: userUpdate.allUsers.count, firstName: "Heyy", lastName: "worked")
        userUpdate.allUsers.append(user)
    }
}

最佳答案

我发现我必须从我的 UI 调用该方法才能使其在同一流上工作。

例如:

struct ContentView : View {
@EnvironmentObject var networkManager: NetworkManager

var body: some View {
    VStack {
        Button(action: {
            self.networkManager.getAllCourses()
        }, label: {
            Text("Get All Courses")
        })

        List(networkManager.courses.identified(by: \.name)) {
            Text($0.name)
        }
    }
}
}

关于ios - 如何使用可绑定(bind)对象(EnvironmentObject)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56500147/

相关文章:

ios - 为什么不在每个 getter 中使用惰性实例化

ios - 无法使 SFSafariViewController 状态栏样式 lightContent

iphone - 在 iPhone 中验证电子邮件

ios - 在没有内存泄漏或类似方法的情况下将许多 UIImage 保存到 NSMutableArray

xcode - 谷歌地图集成到 SwiftUI

list - SwiftUI : How I can use confirmationDialog for each row of a list?

Swift - 父类中属性的默认值应该是什么?

ios - 如何检索 Swift 中所有已安装键盘的列表?

带有范围按钮的导航栏中的 iOS 11 搜索 Controller

ios - SwiftUI - 如何关闭工作 TableView ,同时关闭该 View