【问题标题】:How does one share the value between a local a @State variable and a @Binding one in SwiftUI?如何在 SwiftUI 中的本地 @State 变量和 @Binding 变量之间共享值?
【发布时间】:2020-02-05 01:47:29
【问题描述】:
import SwiftUI

enum ValueType {
    case string(String)
    case int(Int)
}

struct ParentView: View {
    @State var value: ValueType?

    var body: some View {
        ChildView(boundValue: $value)
    }
}

struct ChildView: View {
    @Binding var boundValue: ValueType?

    @State private var userInput: String = ""

    var body: some View {
        TextField("Enter some text", text: $userInput)
    }
}

这里ChildView 具有其父级@State ... answer var 的绑定版本。然而,这里的特定用例涉及一个枚举的绑定,该枚举可以具有StringInt 值,而ChildView 具有TextField 涉及纯String 值。如何将ChildViewuserInput 值转入其boundValue.string(...)

感谢您的阅读。抱歉,如果此问题重复,我进行了搜索但一无所获。

【问题讨论】:

    标签: swift swiftui


    【解决方案1】:

    TextField 初始化器还有两个可选参数用于回调,onEditingChangedonCommit,因此另一种方法是将更新逻辑放入其中。

    TextField("Enter some text", text: $userInput, onCommit: {
        self.boundValue = .string(self.userInput)
    })
    

    【讨论】:

    • 完美解决方案。如果您想通过按下按钮来使用按钮来处理文本数据,您也可以遵循相同的解决方案,只需将 onCommit 闭包部分用于按钮的操作即可。
    【解决方案2】:

    只要您处理所有情况,您就可以使用第二个绑定将字符串桥接到您的自定义枚举。这是一个例子:

    import SwiftUI
    
    enum ValueType {
      case string(String)
      case int(Int)
    }
    
    struct ParentView: View {
      @State var value: ValueType?
      var body: some View {
        ChildView(boundValue: $value)
      }
    }
    
    struct ChildView: View {
      let boundValue: Binding<ValueType?>
      let myCustomBinding: Binding<String>
      init(boundValue: Binding<ValueType?>) {
          myCustomBinding = Binding<String>.init(
          get: {
            switch boundValue.wrappedValue {
            case .string(let string):
              return string
            case .int(let int):
              return String(describing: int)
            case .none:
              return ""
            }
          },
          set: { (string: String) -> Void in
            boundValue.wrappedValue = Int(string).map{ ValueType.int($0)} ?? ValueType.string(string)
          })
        self.boundValue = boundValue.projectedValue
      }
    
      var body: some View {
        TextField("Enter some text", text: myCustomBinding)
      }
    }
    

    【讨论】:

      猜你喜欢
      • 2020-09-11
      • 2021-11-03
      • 2019-11-10
      • 2018-08-13
      • 1970-01-01
      • 2018-12-01
      • 1970-01-01
      • 2018-09-07
      • 2020-04-08
      相关资源
      最近更新 更多