理解@State SwiftUI
Undestranding @State SwiftUI
大家好,我在理解 swiftUI 中的@State 时遇到了问题
我会更好地解释......正如您从 scrollView 内的图像中看到的那样,我有两个视图,一个包含日历,另一个包含用户日期选择的摘要。
现在...我曾经使用用户在日历上选择的日期更新 summaryView
@State private var selectedDate: Date = Self.now
private static var now = Date ()
此外,在包含用户选择摘要的视图中(日历上方的视图),还有一个使用函数创建的随机黄色字符串
// MARK: - Generate Random String
private extension Reservations {
func generateRandomString(length: Int) -> String {
let letters = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"
var s = ""
for _ in 0 ..< length {
s.append(letters.randomElement()!)
}
return s
}
}
每次用户在日历上选择一天时它都会改变。
我的问题是,当用户选择一个日历日时,应用只需更改摘要视图中的日期,而不必再次重复“randomString”函数
这个问题是因为使用了@State 我理解的对吗?我应该使用什么代替 @State 来更改不在同一视图中的单个值?
struct Reservations: View {
@Environment(\.calendar) private var calendar
@State private var selectedDate: Date = Self.now
private static var now = Date()
var body: some View {
Summary()
ReservationsCalendar()
}
}
// MARK: - Generate Random String
private extension Reservations {
func generateRandomString(length: Int) -> String {
let letters = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"
var s = ""
for _ in 0 ..< length {
s.append(letters.randomElement()!)
}
return s
}
@ViewBuilder func Summary() -> some View {
HStack(spacing: 10) {
HStack {
Text(selectedDate.dayFormatted(style: .twoDigits))
.font(.title.bold())
Text("ID").foregroundColor(.white)
Text(generateRandomString(length: 7).uppercased())
.foregroundColor(.yellow)
.padding(.horizontal, 10)
.frame(height: 25)
.background(
Capsule()
.fill(.black.opacity(0.2))
)
}
}
}
@ViewBuilder private func ReservationsCalendar() -> some View {
ReservationsCal(currentDate: $selectedDate)
}
}
现在,您在视图层次结构中调用 generateRandomString
,保证每次重新呈现视图时都会生成一个新的随机字符串。
相反,您可以将其声明为 @State
变量,该变量将在重新渲染期间持续存在(并声明 generateRandomString
以便它可以在初始化阶段使用):
struct Reservations: View {
@State private var selectedDate: Date = Self.now
@State private var randomString = Self.generateRandomString(length: 7)
private static var now = Date()
var body: some View {
Text(randomString.uppercased())
}
}
private extension Reservations {
static func generateRandomString(length: Int) -> String {
let letters = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"
var s = ""
for _ in 0 ..< length {
s.append(letters.randomElement()!)
}
return s
}
}
大家好,我在理解 swiftUI 中的@State 时遇到了问题
我会更好地解释......正如您从 scrollView 内的图像中看到的那样,我有两个视图,一个包含日历,另一个包含用户日期选择的摘要。
现在...我曾经使用用户在日历上选择的日期更新 summaryView
@State private var selectedDate: Date = Self.now
private static var now = Date ()
此外,在包含用户选择摘要的视图中(日历上方的视图),还有一个使用函数创建的随机黄色字符串
// MARK: - Generate Random String
private extension Reservations {
func generateRandomString(length: Int) -> String {
let letters = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"
var s = ""
for _ in 0 ..< length {
s.append(letters.randomElement()!)
}
return s
}
}
每次用户在日历上选择一天时它都会改变。
我的问题是,当用户选择一个日历日时,应用只需更改摘要视图中的日期,而不必再次重复“randomString”函数
这个问题是因为使用了@State 我理解的对吗?我应该使用什么代替 @State 来更改不在同一视图中的单个值?
struct Reservations: View {
@Environment(\.calendar) private var calendar
@State private var selectedDate: Date = Self.now
private static var now = Date()
var body: some View {
Summary()
ReservationsCalendar()
}
}
// MARK: - Generate Random String
private extension Reservations {
func generateRandomString(length: Int) -> String {
let letters = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"
var s = ""
for _ in 0 ..< length {
s.append(letters.randomElement()!)
}
return s
}
@ViewBuilder func Summary() -> some View {
HStack(spacing: 10) {
HStack {
Text(selectedDate.dayFormatted(style: .twoDigits))
.font(.title.bold())
Text("ID").foregroundColor(.white)
Text(generateRandomString(length: 7).uppercased())
.foregroundColor(.yellow)
.padding(.horizontal, 10)
.frame(height: 25)
.background(
Capsule()
.fill(.black.opacity(0.2))
)
}
}
}
@ViewBuilder private func ReservationsCalendar() -> some View {
ReservationsCal(currentDate: $selectedDate)
}
}
现在,您在视图层次结构中调用 generateRandomString
,保证每次重新呈现视图时都会生成一个新的随机字符串。
相反,您可以将其声明为 @State
变量,该变量将在重新渲染期间持续存在(并声明 generateRandomString
以便它可以在初始化阶段使用):
struct Reservations: View {
@State private var selectedDate: Date = Self.now
@State private var randomString = Self.generateRandomString(length: 7)
private static var now = Date()
var body: some View {
Text(randomString.uppercased())
}
}
private extension Reservations {
static func generateRandomString(length: Int) -> String {
let letters = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"
var s = ""
for _ in 0 ..< length {
s.append(letters.randomElement()!)
}
return s
}
}