如何在 SwiftUI 子视图中执行函数?
How to execute a function in a SwiftUI sub-view?
这更像是一个关于 SwiftUI 的一般性理解问题。
我希望能够执行与另一个视图关联的函数。有很多 cases/reasons 可以做到这一点。我最近的努力是拥有一个收集多个字段(如地址)的视图,然后在其他视图中使用该视图。
我的问题是,如何从地址视图中获取数据?在所示示例中,如何调用 getXML()
函数?有没有更好的方法来完成这个?
import SwiftUI
struct AddressView: View
{
@State var street1 = ""
@State var street2 = ""
@State var city = ""
@State var state = ""
@State var zip = ""
var body: some View
{
VStack
{
TextField("Street1", text: $street1)
.textFieldStyle(RoundedBorderTextFieldStyle())
TextField("Street2", text: $street2)
.textFieldStyle(RoundedBorderTextFieldStyle())
TextField("City", text: $city)
.textFieldStyle(RoundedBorderTextFieldStyle())
TextField("State", text: $state)
.textFieldStyle(RoundedBorderTextFieldStyle())
TextField("Zip", text: $zip)
.textFieldStyle(RoundedBorderTextFieldStyle())
}.padding()
}
func getXML() -> String
{
var xml = XMLStuff("Address")
xml.push(tag: "street1", value: street1)
xml.push(tag: "street2", value: street2)
xml.push(tag: "city", value: city)
xml.push(tag: "state", value: state)
xml.push(tag: "zip", value: zip)
return xml.string()
}
}
以下是一些代码,可用于包含多个此类视图,但我不知道如何提取数据以便 save/use 它。
import SwiftUI
struct ContactView: View
{
@State var name: String = ""
var body: some View
{
VStack
{
TextField("Name", text: $name)
AddressView()
PhoneView()
}
}
}
我知道我可以在调用者中创建一堆状态变量,然后将它们传递给子视图,但我会尽可能避免这种情况。
您可以创建一个 ObservableObject
class 来存储您的属性:
class ContactViewModel: ObservableObject {
@Published var street1 = ""
@Published var street2 = ""
@Published var city = ""
@Published var state = ""
@Published var zip = ""
func getXML() -> String {
var xml = XMLStuff("Address")
xml.push(tag: "street1", value: street1)
xml.push(tag: "street2", value: street2)
xml.push(tag: "city", value: city)
xml.push(tag: "state", value: state)
xml.push(tag: "zip", value: zip)
return xml.string()
}
}
然后,在ContentView
中使用这个class:
struct ContactView: View {
@StateObject private var viewModel = ContactViewModel()
@State private var name: String = ""
var body: some View {
VStack {
TextField("Name", text: $name)
AddressView(viewModel: viewModel)
...
}
}
}
并将其传递给 AddressView
:
struct AddressView: View {
@ObservedObject var viewModel: ContactViewModel
var body: some View {
VStack {
TextField("Street1", text: $viewModel.street1)
.textFieldStyle(RoundedBorderTextFieldStyle())
TextField("Street2", text: $viewModel.street2)
.textFieldStyle(RoundedBorderTextFieldStyle())
TextField("City", text: $viewModel.city)
.textFieldStyle(RoundedBorderTextFieldStyle())
TextField("State", text: $viewModel.state)
.textFieldStyle(RoundedBorderTextFieldStyle())
TextField("Zip", text: $viewModel.zip)
.textFieldStyle(RoundedBorderTextFieldStyle())
}.padding()
}
}
您还可以从 ContentView
或 AddressView
:
调用 getXML()
函数
viewModel.getXML()
这更像是一个关于 SwiftUI 的一般性理解问题。
我希望能够执行与另一个视图关联的函数。有很多 cases/reasons 可以做到这一点。我最近的努力是拥有一个收集多个字段(如地址)的视图,然后在其他视图中使用该视图。
我的问题是,如何从地址视图中获取数据?在所示示例中,如何调用 getXML()
函数?有没有更好的方法来完成这个?
import SwiftUI
struct AddressView: View
{
@State var street1 = ""
@State var street2 = ""
@State var city = ""
@State var state = ""
@State var zip = ""
var body: some View
{
VStack
{
TextField("Street1", text: $street1)
.textFieldStyle(RoundedBorderTextFieldStyle())
TextField("Street2", text: $street2)
.textFieldStyle(RoundedBorderTextFieldStyle())
TextField("City", text: $city)
.textFieldStyle(RoundedBorderTextFieldStyle())
TextField("State", text: $state)
.textFieldStyle(RoundedBorderTextFieldStyle())
TextField("Zip", text: $zip)
.textFieldStyle(RoundedBorderTextFieldStyle())
}.padding()
}
func getXML() -> String
{
var xml = XMLStuff("Address")
xml.push(tag: "street1", value: street1)
xml.push(tag: "street2", value: street2)
xml.push(tag: "city", value: city)
xml.push(tag: "state", value: state)
xml.push(tag: "zip", value: zip)
return xml.string()
}
}
以下是一些代码,可用于包含多个此类视图,但我不知道如何提取数据以便 save/use 它。
import SwiftUI
struct ContactView: View
{
@State var name: String = ""
var body: some View
{
VStack
{
TextField("Name", text: $name)
AddressView()
PhoneView()
}
}
}
我知道我可以在调用者中创建一堆状态变量,然后将它们传递给子视图,但我会尽可能避免这种情况。
您可以创建一个 ObservableObject
class 来存储您的属性:
class ContactViewModel: ObservableObject {
@Published var street1 = ""
@Published var street2 = ""
@Published var city = ""
@Published var state = ""
@Published var zip = ""
func getXML() -> String {
var xml = XMLStuff("Address")
xml.push(tag: "street1", value: street1)
xml.push(tag: "street2", value: street2)
xml.push(tag: "city", value: city)
xml.push(tag: "state", value: state)
xml.push(tag: "zip", value: zip)
return xml.string()
}
}
然后,在ContentView
中使用这个class:
struct ContactView: View {
@StateObject private var viewModel = ContactViewModel()
@State private var name: String = ""
var body: some View {
VStack {
TextField("Name", text: $name)
AddressView(viewModel: viewModel)
...
}
}
}
并将其传递给 AddressView
:
struct AddressView: View {
@ObservedObject var viewModel: ContactViewModel
var body: some View {
VStack {
TextField("Street1", text: $viewModel.street1)
.textFieldStyle(RoundedBorderTextFieldStyle())
TextField("Street2", text: $viewModel.street2)
.textFieldStyle(RoundedBorderTextFieldStyle())
TextField("City", text: $viewModel.city)
.textFieldStyle(RoundedBorderTextFieldStyle())
TextField("State", text: $viewModel.state)
.textFieldStyle(RoundedBorderTextFieldStyle())
TextField("Zip", text: $viewModel.zip)
.textFieldStyle(RoundedBorderTextFieldStyle())
}.padding()
}
}
您还可以从 ContentView
或 AddressView
:
getXML()
函数
viewModel.getXML()