假设我有一个绑定的字符串:

@Binding var string: String

但是,我想处理该字符串,然后将其传递给子视图.

struct ViewOne: View {
    @State var string: String = "Hello"
    
    var body: some View {
        ViewTwo(string: string + " World") // this is invalid, as ViewTwo requires Binding<String>
    }
}

struct ViewTwo: View {
    @Binding var string: String
    
    var body: some View {
        Text(string)
    }
}

我应该如何操作该字符串,使其在状态更改时更新UI?假设我想为不同的组件重用ViewTwo,因此我想在将字符串传递到视图之前对其进行操作.

计算变量不起作用,因为它不是Binding

private var fixedString: String {
    return string + " World"
}

我不想创建绑定变量,因为setter在这种情况下没有意义

private var fixedString: Binding<String> {
    Binding<String> (
        get: {
            string + " World"
        }, set: {
            // this function doesn't make sense here - how would it update the original variable?
        }
    )
}

我只是用@State@Binding错了吗?

推荐答案

只需拆下ViewTwo内的@Binding:

struct ViewTwo: View {
    var string: String /// no need for the `@Binding`!
    
    var body: some View {
        Text(string)
    }
}

即使没有@Binding,SwiftUI will也会更新ViewTwo(只要@State@Published变量发生变化,它基本上会重新渲染整个body).

只有在需要更新/设置原始@State@Published属性时,才需要绑定.在这种情况下,你可以在问题中添加类似var fixedString: Binding<String>的内容.

Swift相关问答推荐

为表单部分赋予背景 colored颜色 /渐变

在列表项内的NavigationLink中的按钮无法正常工作

为什么枚举上的.allCases.forEach不是循环(继续和中断不起作用)?

如何强制创建新的UIViewControllerRenatable|更新Make UIViewController上的视图

从SwiftUI使用UIPageView时,同一页面连续显示两次的问题

如何在SWIFT Memory中处理对VAR数组的更新(对COW感到困惑)

BLE 在 ESP32 和 Iphone 之间发送字符串

在 SwiftUI 中禁用 Select 器选项

一组可散列的自定义元素插入相等的元素

如何判断一个值是否为 Int 类型

如何打印出此 struct 中的数据?

如何测试可选 struct 的协议一致性

将 struct 作为泛型类型传递并访问该泛型类型属性

(SwiftLint)如果有正文,如何编写规则(可能是自定义),在{之后总是\n(换行)?

找不到接受提供的参数的/的重载

我将哪种 Swift 数据类型用于货币

EXC_BREAKPOINT 崩溃的原因范围

为什么 swift 中的类没有存储类型属性?

关闭 UITableViewRowAction

swift中静态函数和单例类的区别