ios 如何在SwiftUI中从孙视图更新图像后在主视图上刷新图像

0md85ypi  于 2023-08-08  发布在  iOS
关注(0)|答案(2)|浏览(125)

我有三个层次的结构视图,我不知道如何通过图像的变化,从第三次到第一次。我不清楚如何在我的**“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)
    }
}

cclgggtu

cclgggtu1#

依赖关系总是用@Binding表示。所以如果你想让你的依赖关系传播到child,它必须是

  • @State仅在祖父母中
  • 父级和子级中的@Binding
  • 作为绑定而不仅仅是值传递给父级和子级(即$iconValue)的最大值

于是:

  • ExLibrisStyleView视图正常
  • ExLibrisCategoryItem视图正常
  • ExLibrisCategoryRow视图应具有
@Binding var iconValue: String

字符串
这会将其链接到父节点。然后将它传递给这个视图

ExLibrisCategoryRow(categoryName: key, items: exlibrisData.categories[key]!,iconValue: $iconValue)


这是基础。在这种情况下(当您有3个相关视图时),另一个选项是不重新定义它们的属性,而是在视图模型中定义它们,然后可以在视图之间传递。Here's一个很好的解释

tzdcorbm

tzdcorbm2#

在花了几个小时来解决这个问题或更改视图背后的逻辑之后,我以不同的方式搜索了解决方案,并找到了一个名为@AppStorage的优雅 Package 器,可以使用UserDefaults更新任何视图。这正是我一直在寻找的。我在这篇文章中找到了它,其他链接解释了如何使用。
discussion about Userdefaults change listening
如何使用@AppStorage Package 器

相关问题