当前位置: 首页 > 知识库问答 >
问题:

带有@Binding var的SwiftUI类的初始化

安承教
2023-03-14

我有一个类,我想用在另一个视图中设置的绑定变量初始化它。

查看-

struct CoverPageView: View {
    @State  var numberOfNumbers:Int

    var body: some View {
        NavigationView {
            GeometryReader { geometry in
                VStack(alignment: .center, spacing: 0){
                    TextField("Multiplication Upto:", value: self.$numberOfNumbers, formatter: NumberFormatter())

                }
            }
        }
    }

需要使用 @Binding var $numberofNumbers 初始化的类 -

import SwiftUI

class MultiplicationPractice:ObservableObject {

    @Binding var numberOfNumbers:Int
    var classNumofNumbers:Int

    init() {
        self.classNumofNumbers = self.$numberOfNumbers
    }
}

init语句显然给出了一个错误,即self未初始化,而实例var用于初始化,这是不允许的。

我该如何避免这种情况?需要使用用户在第一个视图中输入的编号初始化该类。我在这里写了大概的代码,所以请忽略任何打字错误。

共有2个答案

皮景龙
2023-03-14

好吧,我真的不明白你的问题,所以我只列出几个例子,希望其中一个就是你正在寻找的。

struct SuperView: some View {
    @State var value: Int = 0

    var body: some View {
        SubView(value: self.$value)
    }
}
struct SubView: View {
    @Binding var value: Int

    // This is the same as the compiler-generated memberwise initializer
    init(value: Binding<Int>) {
        self._value = value
    }

    var body: some View {
        Text("\(value)")
    }
}

如果我理解错了,而你只是想得到当前值,那么这样做

struct SuperView: some View {
    @State var value: Int = 0

    var body: some View {
        SubView(value: self.value)
    }
}
struct SubView: View {
    let value: Int

    // This is the same as the compiler-generated memberwise initializer
    init(value: Int) {
        self.value = value
    }

    var body: some View {
        Text("\(value)")
    }
}
关胜
2023-03-14

通常,您会在CoverPageView中使用起始值初始化乘法练习:

@ObservedObject var someVar = MultiplicationPractice(NoN:123)

当然,添加一个支持的init语句:

class MultiplicationPractice:ObservableObject {
    init(NoN: Int) {
        self.numberOfNumbers = val
    }

您不想用@Binding来包装var,而是用@Published来包装:

class MultiplicationPractice:ObservableObject {

@Published var numberOfNumbers:Int
...

在您的特定情况下,我甚至会在您的<code>CoverPageView</code>中删除<code>numberOfNumbers</code>变量,而是使用上述<code>someVar</code>的直接变量:

struct CoverPageView: View {
    //removed @State  var numberOfNumbers:Int
    @ObservedObject var someVar = MultiplicationPractice(123)
    
    ...
    
    TextField("Multiplication Upto:", value: self.$someVar.numberOfNumbers, formatter: NumberFormatter())

您会注意到我作为绑定传入了@Object的sub-var。我们可以使用观测对象来做到这一点。

我现在明白了您要做的事情,您希望在ViewModel中传递绑定,并在视图和模型之间建立间接连接。虽然这可能不是我个人的做法,但我仍然可以提供一个可行的例子。

下面是一个使用结构名称的简单示例:

struct MultiplicationGame {
    @Binding var maxNumber:String
    init(maxNumber: Binding<String>) {
        self._maxNumber = maxNumber
        print(self.maxNumber)
    }
}

class MultiplicationPractice:ObservableObject {
    var numberOfNumbers: Binding<String>
    @Published var MulGame:MultiplicationGame
    
    init(numberOfNumbers: Binding<String> ) {
        self.numberOfNumbers = numberOfNumbers
        self.MulGame = MultiplicationGame(maxNumber: numberOfNumbers)
    }
    
}
struct ContentView: View {
    @State var someText: String
    @ObservedObject var mulPractice: MultiplicationPractice
    init() {
        let state = State(initialValue: "")
        self._someText = state
        self.mulPractice = MultiplicationPractice(numberOfNumbers: state.projectedValue)
    }
    var body: some View {
        TextField("put your text here", text: $someText)
    }
}
 类似资料:
  • 问题内容: 到目前为止,我一直在使用SwiftUI并了解etc 的概念(至少我希望我这样做)。 我遇到了一个愚蠢的问题,似乎找不到以下答案:如何初始化变量? 我有以下代码: 在我的预览代码中,我想传递该类型的参数: 我将如何进行初始化?尝试过: 甚至: 但是没有一个…有什么想法吗? 问题答案: 在您的应用中使用时,您确实需要提供一些绑定,例如上一个视图中的或。 对于仅需要固定值的特殊情况,可以使用

  • 用j7u5,G1GC 对于给定的性能测试,可以预见,我的应用程序在运行5小时后会出现长时间的暂停。除了这个大的(也是唯一的),还有小的初始标记阶段。 任何建议来弄清楚这个长暂停发生了什么,以及如何调整它以避免影响延迟目标(百分位数98%, 99.999%)的如此长的暂停?

  • 我找不到任何关于这个具体案例的具体SO帖子,所以我想问一下我认为是/否的问题。 以下是JLS§12.4.2(Java SE 8),清单6-7: 我的问题是:这是否意味着子类的final static变量在超类的静态初始化之前初始化(假设final static作为其声明的一部分初始化)?

  • 类初始化规则规定:如果由于访问静态字段而触发类初始化,则只初始化声明了静态字段的类,即使静态字段被子类、子接口的类型或接口的实现类引用,也不会触发超类或子类的初始化。然后在下面的代码中,只应打印“初始化超类”。 } 当我运行这个时,输出:

  • 问题内容: 我对Swift类有疑问。我有一个UITableViewController类和UITableViewCell类的快捷文件。我的问题是UITableViewCell类和插座。此类存在错误 类别“ HomeCell”没有初始化程序 ,并且我不理解此问题。 感谢您的回复。 问题答案: 您必须使用隐式展开的可选变量,以便Swift可以在初始化阶段处理循环依赖关系(在这种情况下,UI组件的父级<

  • 问题内容: 这个问题不是关于为什么我们将列表初始化为实现的接口,例如 问题是以下两个之间有何区别?为什么它们(显然)以相同的方式工作? 问题答案: 这两段代码是等效的,并使用 类型 创建s (在您的示例中): 但是,第二个示例使用Java 7中引入的 菱形运算符 ()。它添加了类型推断,并减少了赋值的冗长性。 请参阅文档中的以下引用: 您可以用一组空的类型参数()来替换调用通用类的构造函数所需的类