Итак, у меня есть этот код:
struct SelectorView: View {
let levelamt: Int = 50
var next: Int = 20
let columns: [GridItem] = [GridItem(), GridItem(), GridItem()]
var body: some View {
NavigationStack {
ZStack {
Color(red: 0, green: 0, blue: 0).ignoresSafeArea()
LazyVGrid(columns: columns) {
ForEach(1..<next, idx: \.self) { x in
NavigationLink(destination: GameView(level: self.x), label: {
ZStack {
Image("Fragment")
.resizable()
.frame(width: 125, height: 125)
.scaledToFit()
Text(String(x))
.font(.system(size: 50, design: .monospaced))
.fontWeight(.bold)
.foregroundColor(Color.white)
}
})
}
}
}
}
}
}
}
Там говорится, что x нельзя передать на уровень Binding Int GameView. Может кто-нибудь сказать мне, как это работает и как это исправить?
Вот код GameView (в нем ничего нет, потому что я еще до него не добрался):
struct GameView: View {
@Binding var level: Int
var body: some View {
Text("hello world")
}
}
Я использую устаревшую версию NavigationLink, потому что лично считаю, что писать код удобнее. Когда я закончу приложение, я посмотрю на него, чтобы оптимизировать. Я также видел другие подобные сообщения, но решения по ним по какой-то причине не работают, возможно, потому, что ForEach представляет собой диапазон, а не массив.
Посмотрите «Демистифицируйте SwiftUI»
Вам не следует использовать индексы в ForEach — упомянутое видео @lorem прояснит это.





...to pass a ForEach variable into a Binding through a NavigationLink,
попробуйте этот подход, используя отдельный struct GameItem для хранения игровых уровней и
используя привязку ($) в цикле ForEach().
struct GameItem: Identifiable { // <--- here
let id = UUID()
var level: Int
}
struct SelectorView: View {
let levelamt: Int = 50
var next: Int = 20
let columns: [GridItem] = [GridItem(), GridItem(), GridItem()]
// for testing
@State private var items = [GameItem(level: 0),GameItem(level: 1),GameItem(level: 2)]
var body: some View {
NavigationStack {
ZStack {
Color(red: 0, green: 0, blue: 0).ignoresSafeArea()
LazyVGrid(columns: columns) {
ForEach($items) { $item in // <--- here $
NavigationLink(destination: GameView(level: $item.level), label: { // <--- here
ZStack {
Image("Fragment")
.resizable()
.frame(width: 125, height: 125)
.scaledToFit()
Text(String(item.level)) // <--- here
.font(.system(size: 50, design: .monospaced))
.fontWeight(.bold)
.foregroundColor(Color.white)
}
})
}
}
}
}
}
}
struct GameView: View {
@Binding var level: Int
var body: some View {
Text("GameView \(level)")
Button("Increment level") { // <--- for testing
level += 1
}
}
}
struct ContentView: View {
var body: some View {
SelectorView()
}
}
Вам необходимо обновить вопрос и объяснить, почему вам нужен
@BindingвGameView. Непонятно, чего вы пытаетесь достичь.