当前位置: 首页 > 知识库问答 >
问题:

SwiftUI/Combine在两个模型之间传递数据

温成济
2023-03-14

我对如何在两个模型之间传递数据有疑问。

struct SettingsCell: View {
    @State var isOn: Bool

    var body: some View {
        Toggle(name, isOn: $isOn)
    }
}

class SettingsModel: ObservableObject {
    @Published var someValue: Bool = false
}

struct SettingsView: View {
    @ObservedObject var model = SettingsModel()

    var body: some View {
        List {
            SettingsCell(isOn: model.someValue)
        }
    }
}

所以我想把状态从单元传递到主模型,并在那里进行反应。例如发送请求。

共有2个答案

傅朝
2023-03-14

绑定用于父视图“拥有”数据的情况--即父视图持有真值的来源--并且需要子视图对其进行更新:

struct SettingsCell: View {
    @Binding var isOn: Bool // change to Binding

    var body: some View {
        Toggle(name, isOn: $isOn)
    }
}

struct SettingsView: View {
    // unrelated, but better to use StateObject
    @StateObject var model = SettingsModel() 

    var body: some View {
        List {
            // pass the binding by prefixing with $
            SettingsCell(isOn: $model.someValue)
        }
    }
}
夏经武
2023-03-14

您需要在settingscell中将ison声明为@binding

@state只能用于在视图本身内初始化的属性,并且必须始终为private。如果希望传入一个值,该值应在视图更改时更新该视图,但该值是在视图外部创建的,则需要使用绑定

另一个需要注意的非常重要的事情是,@ObservedObjects必须始终被注入到views中,您不能在视图本身中初始化它们。这是因为每当更新@ObservedObject时,它就会更新视图本身,因此如果您在视图中初始化对象,每当对象更新视图时,视图就会创建一个新的@ObservedObject,因此您的更改不会从视图持久化到模型中。

如果您的目标是IOS14,并且希望在视图中创建模型,则可以使用@stateobject

struct SettingsCell: View {
    @Binding private var isOn: Bool

    init(isOn: Binding<Bool>) {
        self._isOn = isOn
    }

    var body: some View {
        Toggle(name, isOn: $isOn)
    }
}

class SettingsModel: ObservableObject {
    @Published var someValue: Bool = false
}

struct SettingsView: View {
    @ObservedObject private var model: SettingsModel

    init(model: SettingsModel) {
        self.model = model
    }

    var body: some View {
        List {
            SettingsCell(isOn: $model.someValue)
        }
    }
}
 类似资料:
  • 问题内容: 我有两个 -我有和同赛格瑞“模式” -我有与(回FirstVC): 我创建的委托为: 下一个: 我的函数,在此函数中,我的委托用作: FirstVC: 请帮助我解决这个问题。 问题答案: 1)您需要将委托设置为prepareForSegue: 更新: 2)设为可选

  • 问题内容: 我在页面上有一个组件的两个实例(搜索字段),在它们之间有另一个组件(进行服务器调用的按钮),例如: 我要做的只是将一个未修改的参数从CardSearch字段传递到RunOnServer按钮,但是如果简单的话,我该死的。据此,我可以使用this.state.var作为道具,但是这样做可以在编译代码时给我’undefined.state.var’。React的官方文档并不出色。他们只是告诉

  • 问题内容: 我想单击一列并将单元格索引发送到新阶段。但是我无法将参数()传递给另一个控制器。我已经尝试了所有方法,但仍然无法正常工作。 主控制器 EditClientController 问题答案: 如果要在FXML文件中指定控制器(因此您不能使用Deepak的答案), 并且 要访问方法中的索引(因此您不能使用José的答案),则可以使用控制器工厂:

  • 我的应用程序包含5个ViewControllers的TabBar控制器可以单击每个viewcontrollers中的一个按钮,该按钮将弹出另一个视图,用户可以在其中选择一个设置。按钮(被点击)应该根据每个ViewController中选择的设置来改变其背景。因此,如果用户点击VC1中的按钮并选择设置,该信息应该传播到所有其他VC中,以便按钮具有相同的背景。 我正在使用故事板,我知道这很容易在2VC

  • 我正在使用jquerymobile/jquery/js开发网页。我想将数据从一个页面传递到另一个页面。 使用jquerymobile中的多页模板,我可以实现这一点,但可以帮助我使用单页模板。请我不想使用全局变量或cookie或本地存储或使用url。试图通过使用Jquery.data但无法实现此目的。请发布一个示例。 我有两页。在第二页连接“pagebeforeshow”事件时,我没有得到b1按钮对

  • 问题内容: 我有两个单独的android应用程序,即AppA和AppB。我试图让AppA启动AppB(这是一个游戏应用程序)。用户玩完游戏(AppB)后,它将把游戏记录发送回AppA。 因此,AppA可以正确启动AppB,但是当用户玩完游戏(AppB)后,AppB在将数据发送回AppA时崩溃,并且出现了以下错误: 流程:com.joy.AppB,PID:20265 android.content.