我有一个类,我想用在另一个视图中设置的绑定变量初始化它。
查看-
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用于初始化,这是不允许的。
我该如何避免这种情况?需要使用用户在第一个视图中输入的编号初始化该类。我在这里写了大概的代码,所以请忽略任何打字错误。
好吧,我真的不明白你的问题,所以我只列出几个例子,希望其中一个就是你正在寻找的。
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)")
}
}
通常,您会在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中引入的 菱形运算符 ()。它添加了类型推断,并减少了赋值的冗长性。 请参阅文档中的以下引用: 您可以用一组空的类型参数()来替换调用通用类的构造函数所需的类