我有三个层次的结构视图,我不知道如何通过图像的变化,从第三次到第一次。我不清楚如何在我的**“iconValue”**属性中使用@State和@Binding。最高级别视图上的图像仅在关闭并重新打开屏幕后更改。
最高级别的视图是“ExLibrisStyleView”。它包括从“ExLibrisCategoryRow”视图馈送的图标集合的行类别。在视图的顶部,它显示选定的图标。“ExLibrisCategoryRow”是从“ExLibrisCategoryItem”调用的图像的组合。当我点击任何图像时,我想立即更改视图顶部的选定图标。但是,在主视图被关闭并再次重新打开后,它会发生变化。真的很感激告诉我哪里是错误的,导致图像更新后,重新打开视图。
我为每个结构视图编写的代码是:
ExLibrisStyleView
视图
import SwiftUI
struct ExLibrisStyleView: View {
@EnvironmentObject var exlibrisData: ExLibrisModelData
@State var iconValue = UserDefaults.standard.string(forKey: "iconValue")
var body: some View {
NavigationView{
List {
VStack(alignment: .leading) {
Text("Selected Bookmark").font(.headline).padding(.bottom,15)
Image(iconValue ?? "exlibris-0")
.renderingMode(.original)
.resizable()
.frame(width: 130, height: 130)
.cornerRadius(5)
.shadow(color: Color(red:0, green:0, blue:0, opacity:0.25), radius: 8, x: 0, y: 0)
}
.padding(.leading, 15)
.padding(.bottom,30)
.listStyle(.inset)
.listRowInsets(EdgeInsets())
ForEach(exlibrisData.categories.keys.sorted(), id: \.self) { key in
ExLibrisCategoryRow(categoryName: key, items: exlibrisData.categories[key]!,iconValue: iconValue ?? "exlibris-0")
}
.listRowInsets(EdgeInsets())
}
.listStyle(.inset)
.navigationTitle("Bookmark Collection")
}
}
}
字符串
ExLibrisCategoryRow
视图:
import SwiftUI
struct ExLibrisCategoryRow: View {
var categoryName: String
var items: [ExLibris]
@State var iconValue: String
var body: some View {
VStack(alignment: .leading) {
Text(categoryName)
.font(.headline)
.padding(.leading, 15)
ScrollView(.horizontal, showsIndicators: false) {
HStack(alignment: .top, spacing: 0) {
ForEach(items) { exlibris in
label: do {
ExLibrisCategoryItem(exlibris: exlibris, iconValue: $iconValue)
}
}
}
}
.frame(height: 200)
}
}
}
型
ExLibrisCategoryItem
视图:
import SwiftUI
struct ExLibrisCategoryItem: View {
var exlibris: ExLibris
@Binding var iconValue: String
var body: some View {
VStack(alignment: .leading) {
Image(exlibris.imageName)
.renderingMode(.original)
.resizable()
.frame(width: 130, height: 130)
.cornerRadius(5)
.onTapGesture {
print(iconValue)
UserDefaults.standard.set(exlibris.imageName, forKey: "iconValue")
iconValue = UserDefaults.standard.string(forKey: "iconValue") ?? "exlibris-0"
}
}
.padding(.leading, 15)
}
}
型
2条答案
按热度按时间cclgggtu1#
依赖关系总是用
@Binding
表示。所以如果你想让你的依赖关系传播到child,它必须是@State
仅在祖父母中@Binding
$iconValue
)的最大值于是:
ExLibrisStyleView
视图正常ExLibrisCategoryItem
视图正常ExLibrisCategoryRow
视图应具有字符串
这会将其链接到父节点。然后将它传递给这个视图
型
这是基础。在这种情况下(当您有3个相关视图时),另一个选项是不重新定义它们的属性,而是在视图模型中定义它们,然后可以在视图之间传递。Here's一个很好的解释
tzdcorbm2#
在花了几个小时来解决这个问题或更改视图背后的逻辑之后,我以不同的方式搜索了解决方案,并找到了一个名为@AppStorage的优雅 Package 器,可以使用UserDefaults更新任何视图。这正是我一直在寻找的。我在这篇文章中找到了它,其他链接解释了如何使用。
discussion about Userdefaults change listening
如何使用@AppStorage Package 器