小编Pet*_*orn的帖子

SwiftUI 验证文本字段中的输入

我试图通过使用正则表达式删除某些字符来验证 TextField 中的用户输入。不幸的是,我遇到了text递归调用自身 var的 didSet 方法的问题。

import SwiftUI
import Combine

class TextValidator: ObservableObject {

    @Published var text = "" {
        didSet {
            print("didSet")
            text = text.replacingOccurrences(
                of: "\\W", with: "", options: .regularExpression
            ) // `\W` is an escape sequence that matches non-word characters.
        }
    }

}


struct ContentView: View {

    @ObservedObject var textValidator = TextValidator()

    var body: some View {
        TextField("Type Here", text: $textValidator.text)
            .padding(.horizontal, 20.0)
            .textFieldStyle(RoundedBorderTextFieldStyle())

    }
}
Run Code Online (Sandbox Code Playgroud)

swift 文档(请参阅 AudioChannel 结构)中,Apple 提供了一个示例,其中在其自己的 didSet 方法中重新分配了一个属性,并明确指出这不会导致再次调用 …

swift swiftui

10
推荐指数
3
解决办法
3999
查看次数

SwiftUI - @State 属性未更新

我在 SwiftUI 中遇到了这个非常奇怪的问题/错误。在该setupSubscription方法中,我创建一个订阅subject并将其插入到cancellables集合中。然而,当我打印 的计数时cancellables,我得到零。如果我刚刚插入一个元素,集合怎么会是空的呢?这可能就是handleValue当我点击按钮时不调用该方法的原因。这是控制台的完整输出:

init
begin setupSubscription
setupSubscription subject sink: receive subscription: (CurrentValueSubject)
setupSubscription subject sink: request unlimited
setupSubscription subject sink: receive value: (initial value)
handleValue: 'initial value'
setupSubscription: cancellables.count: 0
setupSubscription subject sink: receive cancel
sent value: 'value 38'
cancellables.count: 0
sent value: 'value 73'
cancellables.count: 0
sent value: 'value 30'
cancellables.count: 0
Run Code Online (Sandbox Code Playgroud)

我究竟做错了什么?为什么我的订阅被subject取消了?为什么handleValue我点击按钮后没有接到电话?

import SwiftUI
import Combine

struct Test: View {
    
    @State private var …
Run Code Online (Sandbox Code Playgroud)

swift swiftui combine

5
推荐指数
2
解决办法
4203
查看次数

标签 统计

swift ×2

swiftui ×2

combine ×1