更改文本字段的禁用状态时获取`AttributeGraph:循环检测`错误

Posted

技术标签:

【中文标题】更改文本字段的禁用状态时获取`AttributeGraph:循环检测`错误【英文标题】:Get `AttributeGraph: cycle detected` error when changing disabled state of text field 【发布时间】:2021-12-07 17:18:53 【问题描述】:

当我在我的视图中更新 isDisabled 状态变量时,它会按预期更新我的文本字段的 .disabled 修饰符,但随后会导致控制台中出现大约 40 个以下错误实例(具有不同的属性最后的数字): === AttributeGraph: cycle detected through attribute 200472 ===

然后它说:AttributeGraphError[59460:4808136] [SwiftUI] Modifying state during view update, this will cause undefined behavior.

这是产生错误的代码的最小版本:

struct ContentView: View 
  @State var isDisabled = false
  @State var text = ""
  
  var body: some View 
    VStack 
      TextField("", text: $text)
        .textFieldStyle(.roundedBorder)
        .disabled(isDisabled)

      Button("Disable text field")  isDisabled = true 
    
  

如何解决这个错误?

【问题讨论】:

【参考方案1】:

经过几个小时的痛苦调试,我找到了解决方案!

事实证明,问题在于您无法在用户仍在编辑该字段时禁用该文本字段。相反,您必须先退出文本字段(即关闭键盘),然后然后禁用文本字段。

这是我更新的代码:

struct ContentView: View 
  @State var isDisabled = false
  @State var text = ""
  
  var body: some View 
    VStack 
      TextField("", text: $text)
        .textFieldStyle(.roundedBorder)
        .disabled(isDisabled)

      Button("Disable text field") 
        closeKeyboard()
        isDisabled = true
      
    
  

  func closeKeyboard() 
    UIApplication.shared.sendAction(
      #selector(UIResponder.resignFirstResponder), to: nil, from: nil, for: nil
    )
  

【讨论】:

以上是关于更改文本字段的禁用状态时获取`AttributeGraph:循环检测`错误的主要内容,如果未能解决你的问题,请参考以下文章

Angular:在更改和设置字段值时禁用字段

禁用文本框丢失视图状态

UITextField:更改禁用文本字段的外观

如果文本框处于焦点,则禁用 jQuery 事件

如何更改/覆盖Vuetify js中禁用字段的默认颜色?

Oracle Apex 根据 LOV 选择的值动态启用/禁用文本字段