I have a UIKit project, and I added a SwiftUI page into the project. And I pushed the SwiftUI page with the following code.
And here's the models.
And here's the view code.
Code Block swift @IBAction func push(_ sender: Any) { let viewController = UIHostingController(rootView: OrangeConfigListView().environmentObject(Store())) navigationController?.pushViewController(viewController, animated: true) }
And here's the models.
Code Block swift struct Group: Codable, Identifiable { var id:Int { name.hash } var name: String var configs: [Config] } struct Config: Codable, Identifiable { var key: String var value: String var id: Int { key.hash } var mocked = false var mockedValue: String? enum CodingKeys: String, CodingKey { case key case value } } final class Store: ObservableObject { @Published var groups: [Group] init() { /* load groups */ } func mock(group: Group, config: Config, mockedValue: String) { let groupIndex = groups.firstIndex(matching: group) let configIndex = group.configs.firstIndex(matching: config) groups[groupIndex].configs[configIndex].mocked = true groups[groupIndex].configs[configIndex].mockedValue = mockedValue } func unmock(group: Group, config: Config) { let groupIndex = groups.firstIndex(matching: group) let configIndex = group.configs.firstIndex(matching: config) groups[groupIndex].configs[configIndex].mocked = false groups[groupIndex].configs[configIndex].mockedValue = nil } }
And here's the view code.
Code Block swift struct OrangeConfigCell: View { @State var text: String var config: OrangeConfig var mockAction: (String) -> Void var body: some View { VStack { HStack { Text(config.key) .font(.subheadline) Spacer() Button(config.mocked ? "Unmock" : "Mock") { self.mockAction(text) } .foregroundColor(.blue) } TextView(text: $text, borderColor: config.mocked ? colorLiteral(red: 0.4745098054, green: 0.8392156959, blue: 0.9764705896, alpha: 1) : colorLiteral(red: 0.501960814, green: 0.501960814, blue: 0.501960814, alpha: 1)) .frame(height: 200) } .buttonStyle(PlainButtonStyle()) } } But when I triggered 'mockAction', I something wired just happened, the 'store' become nil! How would this happen ?