gpt4 book ai didi

ios - 在 swiftUI 中的 View 数组之间切换

转载 作者:行者123 更新时间:2023-12-01 18:34:46 25 4
gpt4 key购买 nike

swift 5.x iOS 13.x

我创建了一系列骰 subview ,我想在它们之间切换。为了简短起见,我在这里只展示两个 View 。我创建了一个 View 数组,但我不太清楚如何在 SwiftUI 中解决它?或者实际上 View 是什么类型的对象,因为它不是 View 或它看起来的某些 View 。

import SwiftUI
import GameplayKit

let dotSize:CGFloat = 24
let diceSize:CGFloat = 128
let fieldSide:CGFloat = 32

let d6 = GKRandomDistribution.d2()

var diceViews:[Any] = [oneDotDice(),twoDotDice()]

struct ContentView: View {
@State var showInt:Int = 1
var body: some View {

VStack {
if showInt == 1 {
oneDotDice()
.transition(AnyTransition.opacity)
.animation(.default)
.modifier(changeDice(showInt: self.$showInt))
}
if showInt == 2 {
twoDotDice()
.transition(AnyTransition.opacity)
.animation(.default)
.modifier(changeDice(showInt: self.$showInt))
}
}
}

struct oneDotDice: View {
var body: some View {
Rectangle()
.fill(Color.clear)
.frame(width: diceSize, height: diceSize, alignment: .center)
.border(Color.black)
.background(Text(1))
}
}

struct twoDotDice: View {
var body: some View {
Rectangle()
.fill(Color.clear)
.frame(width: diceSize, height: diceSize, alignment: .center)
.border(Color.black)
.background(Text(2))
}
}

struct changeDice: ViewModifier {
@Binding var showInt:Int
func body(content: Content) -> some View {
content
.onTapGesture {
self.showInt = d6.nextInt()
print("Int ",self.showInt)
}
}
}

如何在主循环中使用我的 View 数组来改进这段代码?我什至不能使用它在 SwiftUI 代码中出现的 switch 语句。我需要使用六个嵌套的 if/else 语句...

最佳答案

View 只是一个结构体。您可以将它存储在数组或其他属性类型中,然后在另一个 View 中使用它。如果您真的想在一个集合中混合使用不同类型的 View ,AnyView 是一个很好的解决方案。为了动态显示该集合,我喜欢使用 Foreach。您可以迭代的不是确切的 View ,而是数组的索引。因此 SwiftUI 将从它的数组索引中创建这个 View 的键。但这是有代价的。您不能动态更改该数组的内容。它必须在所有父 View 生命周期中保持不变。老实说,您实际上可以通过 Foreach 迭代确切的 View ,但您需要使它们可识别(它们必须具有 public var id = UUID() 属性)。

import SwiftUI

let dotSize:CGFloat = 24
let diceSize:CGFloat = 128
let fieldSide:CGFloat = 32


struct ContentView: View {
var diceViews:[AnyView] = [AnyView(oneDotDice()), AnyView(twoDotDice())]
@State var showInt: Int = 1
var body: some View {
ZStack{
ForEach(diceViews.indices){ind in
ZStack{
if ind == self.showInt{
self.diceViews[ind]
.transition(.scale(scale: 0, anchor: .center))
.onTapGesture {
let newShow = Int.random(in: 0...1)
print("new show id \(newShow)")
withAnimation(.linear(duration: 0.3)){
self.showInt = newShow
}
}
}
}

}
}
}
}
struct oneDotDice: View {
var text: String = "1"
var body: some View {
Rectangle()
.fill(Color.clear)
.frame(width: diceSize, height: diceSize)
.border(Color.black)
.background(Text(text))
}
}

struct twoDotDice: View {
var text: String = "2"
var body: some View {
Rectangle()
.fill(Color.clear)
.frame(width: diceSize, height: diceSize)
.border(Color.black)
.background(Text(text))
}
}


struct ContentView_Previews: PreviewProvider {
static var previews: some View {
ContentView()
}
}

顺便说一句,我改变了你的随机逻辑,不知道它是如何工作的,但我认为它对你的问题并不重要。

关于ios - 在 swiftUI 中的 View 数组之间切换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61771867/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com