ios - textFieldDidChangeSelection : Modifying state during view update, 这将导致未定义的行为

标签 ios swift uikit swiftui

这是我的代码:

struct CustomTextField: UIViewRepresentable {
    var placeholder: String
    @Binding var text: String

    func makeUIView(context: UIViewRepresentableContext<CustomTextField>) -> UITextField {
        let uiView = UITextField()
        uiView.delegate = context.coordinator

        return uiView
    }

    func updateUIView(_ uiView: UITextField, context: UIViewRepresentableContext<CustomTextField>) {
        uiView.placeholder = placeholder
        uiView.text = text

        if uiView.window != nil, !uiView.isFirstResponder {
            uiView.becomeFirstResponder()
        }
    }

    func makeCoordinator() -> Coordinator {
        Coordinator(self)
    }

    class Coordinator: NSObject, UITextFieldDelegate {
        var parent: CustomTextField

        init(_ CustomTextField: CustomTextField) {
            self.parent = CustomTextField
        }

        func textFieldDidChangeSelection(_ textField: UITextField) {
            parent.text = textField.text ?? ""
        }
    }
}

构建不会导致警告,但在模拟器中使用 CustomTextField 会导致警告。

这是警告:

Modifying state during view update, this will cause undefined behavior.

它显示在这一行:

parent.text = textField.text ?? ""

如何消除此警告?我做错了什么?

最佳答案

尝试异步执行修改:

func textFieldDidChangeSelection(_ textField: UITextField) {
    DispatchQueue.main.async {
        self.parent.text = self.textField.text ?? ""
    }
}

关于ios - textFieldDidChangeSelection : Modifying state during view update, 这将导致未定义的行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58878980/

相关文章:

ios - 如何更改托管博览会应用程序中的 Root View 背景?

iphone - 将导航栏剪辑到 ScrollView

ios - 以编程方式创建的 UIButton 不可见

iphone - iPhone应用程式已锁定地区

ios - 捏缩放 ScrollView 内 UIImageView 的效果?

iOS:查找当前位置的语言

ios - 快速将 mp3 文件转换为 URL

ios - UIButton 图像位置取决于 titleLabel 的框架

ios - 适用于 iOS 12 的 cocos2d v2.0 的第一个工作版本?

android - 解析云代码奇怪的错误