这是我第一次使用SWIFT,这是我迄今为止收集到的信息.我不确定为什么HomeContent View不能动态显示基于filemanager.directoryFiles的内容.有没有一种简单的方法可以根据内部视图中的状态动态显示外部视图的内容?

import SwiftUI

struct FileManagerView: View {
    
    @State private var directoryFiles: String
    
    fileprivate init(directoryFiles: String) {
        self.directoryFiles = directoryFiles
    }
    
    func getDirectoryFiles() -> String {
        return self.directoryFiles
    }
    
    func selectFolder() {
        self.directoryFiles = "Test"
    }
    
    var body: some View {
        Button(action: {
            self.directoryFiles = "Test"
        }) {
            Text("Select Folder")
        }
    }
}

struct HomeContentView: View {

    let filemanager = FileManagerView(directoryFiles: "")
    
    var body: some View {
        VStack {
            Text("Select a file directory to generate photo albums from.")
                .padding(5)
                .multilineTextAlignment(.center)
            
            if (filemanager.getDirectoryFiles() == "") {
                filemanager
            } else if (filemanager.getDirectoryFiles() == "Test") {
                Text("Test is selected")
            } else {
                Text(filemanager.getDirectoryFiles())
            }
        }
    }
}

#Preview {
    HomeContentView()
}

推荐答案

好的,希望您能通过自己的绑定让它正常工作.下面是我的解决方案,将其与之进行比较:

struct HomeContentView: View {
    @State private var fileSelectedViaFileManagerView = ""
    
    var body: some View {
        VStack {
            Text("Select a file directory to generate photo albums from.")
                .padding(5)
                .multilineTextAlignment(.center)
            
            if fileSelectedViaFileManagerView == "" {
                FileManagerView(selectedFile: $fileSelectedViaFileManagerView)
            } else {
                Text("\(fileSelectedViaFileManagerView) is selected")
            }
        }
    }
}

struct FileManagerView: View {
    @Binding var selectedFile: String
    
    var body: some View {
        Button("Select Folder") {
            selectedFile = "Test"
        }
    }
}

您应该阅读这篇关于在SwiftUI中的视图之间传递数据的精彩文章.这就是你所需要的:https://www.vadimbulavin.com/passing-data-between-swiftui-views/美元

总而言之:

  • From Parent to Direct Child:使用初始化器
  • From Parent to Distant Child:使用@Environment
  • From Child to Direct Parent:使用@Binding和回调
  • From Child to Distant Parent:使用PreferenceKey
  • Between Children:提升状态(让父级包含@State属性)

您的视图没有更新的原因是因为SwiftUI只在值properties发生更改时才会发现.因此,使用如下函数的返回值

if (filemanager.getDirectoryFiles() == "") {
    filemanager
} else if (filemanager.getDirectoryFiles() == "Test") {
    Text("Test is selected")
} else {
    Text(filemanager.getDirectoryFiles())
}

不会触发更新,因为这些不是房产.祝你学习Swift 好运!

Ios相关问答推荐

如何使用超薄material ,但没有浅色/填充?

Xamarin Forms CustomPin iOS Render

带有故事板的Xcode 15 UIKit视图可以与#Preview宏一起使用吗?

Swift-如何通过Case Let访问模型变量

分配给指针会通过 class_addMethod 导致 EXC_BAD_ACCESS

swiftui 图像放大时无法正确拖动

如何在 Android 上的 Flutter 应用中录制内部音频?

Swift UI中如何为Text提供内部填充

ITMS-90725 无用的错误信息,因为它自相矛盾,苹果上传

SwiftUI - TextField - 在焦点上清除 Double 类型的值,在取消 Select 时恢复

使用 AVCaptureDeviceTypeBuiltInTripleCamera 时 Select 合适的相机进行条码扫描

iOS 16 堆栈视图中按钮的奇怪动画

渲染的海边重定向在物理 iOS 设备上不起作用

SwiftUI 中的偏移量和按钮有问题吗?

在 iPad 上删除列表的顶部和底部行

将图像保存到 Documents 目录并检索邮箱附件

UITableView 页脚,停止浮动内容

如何在 iPhone 中为透明的 PNG 图像着色?

关闭通过模态 segue 显示的视图

Xcode中的终端窗口?