【问题标题】:Swift - didSet property not called from binding changesSwift - didSet 属性未从绑定更改中调用
【发布时间】:2023-04-11 11:50:01
【问题描述】:

我的问题:

我想在点击我的 customView 时调用一个函数

所以我使用@State 变量从我的自定义视图中观察点击操作。但问题是我的值改变了但 didSet 函数没有触发

我的代码:

主结构:

   @State var buttonClicked : Bool = false {
        didSet{
          needToCallMyFunction() // not triggered 
        }
    }

自定义结构:(对于我的自定义视图)

@Binding var isClicked : Bool

someview
.onTapGesture(perform: {
            print("custom clicked")
            isClicked.toggle()
        })

【问题讨论】:

  • 你是如何从主类初始化自定义类的?
  • @MidhunMP 它的结构。我使用一个自定义结构来自定义视图

标签: ios swift swiftui


【解决方案1】:

在主视图中改用.onChange(of:)修饰符,比如

  SomeView()
    .onChange(of: buttonClicked) { _ in
       self.needToCallMyFunction()
    }

更新:SwiftUI 1.0 / iOS 13+ 的变体

import Combine   // needed to use Just

...

  SomeView()
    .onReceive(Just(buttonClicked)) { _ in
       self.needToCallMyFunction()
    }

【讨论】:

  • 嗨 Asperi 两者不在同一个结构中。如果我从 StructB 中单击,则 StructA 有一个视图(StructB)-> 我想触发 StructA 函数
  • 没关系,改变绑定只会改变现实中的状态,所以在声明状态的情况下使用它。
  • onChange 仅适用于 14 +。我的应用从 13 开始支持
  • 查看更新版本以支持 iOS 13。
【解决方案2】:

Asperi 解决方案运行良好。

但它在较低版本中有一个错误。多次调用

我找到了另一个解决方案

SomeView(buttonClicked: 
             Binding(get: { self.buttonClicked },
                     set: { self.buttonClicked = $0
                               print("your action here ")
                }))
                       

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-12
    • 2017-06-27
    相关资源
    最近更新 更多