在 SwiftUI 中切换视图
Switch between views in SwiftUI
基本上,我试图从只有徽标和进度视图栏的加载页面转到名为 HomeView 的全新屏幕。每当进度条完成加载时,我想直接进入 HomeView,我再也不会回到加载页面。有没有办法像这样在屏幕之间切换?
我在 youtube 上看到很多人使用导航链接,但我没有按钮或任何东西来触发它。另外,我看到当他们转到新页面时,他们仍然可以点击蓝色返回按钮返回加载页面,这是我不希望发生的。
我把代码留在下面,以防大家需要参考。
我是 ios 编程新手,感谢大家的帮助。
这是加载页面
import SwiftUI
struct ContentView: View {
@State var downloadAmount: Float = 0.0
let timer = Timer.publish(every: 0.1, on: .main, in: .common).autoconnect()
var body: some View {
ZStack {
Color (red: 12/255, green: 18/255, blue: 25/255).edgesIgnoringSafeArea(.all)
VStack(spacing: 30.0) {
Image("logo")
ProgressView(value: downloadAmount, total: 50).accentColor(Color(red: 255/255, green: 232/255, blue: 147/255)) }.padding(.horizontal, 50)
.onReceive(timer) { _ in
if downloadAmount < 50 {
downloadAmount += 2
}
}
}
}
}
struct ContentView_Previews: PreviewProvider {
static var previews: some View {
ContentView()
}
}
而且我想在进度条用完后直接进入HomeView
import SwiftUI
struct HomeView: View {
@State var progressValue: Float = 0.2
var body: some View {
Text("Hello World")
}
}
struct HomeView_Preview: PreviewProvider {
static var previews: some View {
ContentView()
}
}
您可以根据 downloadAmount
属性 提出不同的观点。我还建议在更新进度条时使用 withAnimation
:
struct ContentView: View {
@State var downloadAmount: Float = 0.0
let timer = Timer.publish(every: 0.1, on: .main, in: .common).autoconnect()
var body: some View {
ZStack {
Color(red: 12 / 255, green: 18 / 255, blue: 25 / 255).edgesIgnoringSafeArea(.all)
if downloadAmount >= 50 { // display conditionally
HomeView()
} else {
logoView
}
}
.onReceive(timer) { _ in
if downloadAmount < 50 {
withAnimation { // add animation
downloadAmount += 2
}
}
}
}
var logoView: some View { // extract as a computed variable for clarity
VStack(spacing: 30.0) {
Image("logo")
ProgressView(value: downloadAmount, total: 50).accentColor(Color(red: 255 / 255, green: 232 / 255, blue: 147 / 255))
}
.padding(.horizontal, 50)
}
}
我建议将徽标视图提取到另一个结构/计算 属性。此外,将 timer 逻辑移动到 @ObservableObject
.
可能会很好
基本上,我试图从只有徽标和进度视图栏的加载页面转到名为 HomeView 的全新屏幕。每当进度条完成加载时,我想直接进入 HomeView,我再也不会回到加载页面。有没有办法像这样在屏幕之间切换?
我在 youtube 上看到很多人使用导航链接,但我没有按钮或任何东西来触发它。另外,我看到当他们转到新页面时,他们仍然可以点击蓝色返回按钮返回加载页面,这是我不希望发生的。
我把代码留在下面,以防大家需要参考。
我是 ios 编程新手,感谢大家的帮助。
这是加载页面
import SwiftUI
struct ContentView: View {
@State var downloadAmount: Float = 0.0
let timer = Timer.publish(every: 0.1, on: .main, in: .common).autoconnect()
var body: some View {
ZStack {
Color (red: 12/255, green: 18/255, blue: 25/255).edgesIgnoringSafeArea(.all)
VStack(spacing: 30.0) {
Image("logo")
ProgressView(value: downloadAmount, total: 50).accentColor(Color(red: 255/255, green: 232/255, blue: 147/255)) }.padding(.horizontal, 50)
.onReceive(timer) { _ in
if downloadAmount < 50 {
downloadAmount += 2
}
}
}
}
}
struct ContentView_Previews: PreviewProvider {
static var previews: some View {
ContentView()
}
}
而且我想在进度条用完后直接进入HomeView
import SwiftUI
struct HomeView: View {
@State var progressValue: Float = 0.2
var body: some View {
Text("Hello World")
}
}
struct HomeView_Preview: PreviewProvider {
static var previews: some View {
ContentView()
}
}
您可以根据 downloadAmount
属性 提出不同的观点。我还建议在更新进度条时使用 withAnimation
:
struct ContentView: View {
@State var downloadAmount: Float = 0.0
let timer = Timer.publish(every: 0.1, on: .main, in: .common).autoconnect()
var body: some View {
ZStack {
Color(red: 12 / 255, green: 18 / 255, blue: 25 / 255).edgesIgnoringSafeArea(.all)
if downloadAmount >= 50 { // display conditionally
HomeView()
} else {
logoView
}
}
.onReceive(timer) { _ in
if downloadAmount < 50 {
withAnimation { // add animation
downloadAmount += 2
}
}
}
}
var logoView: some View { // extract as a computed variable for clarity
VStack(spacing: 30.0) {
Image("logo")
ProgressView(value: downloadAmount, total: 50).accentColor(Color(red: 255 / 255, green: 232 / 255, blue: 147 / 255))
}
.padding(.horizontal, 50)
}
}
我建议将徽标视图提取到另一个结构/计算 属性。此外,将 timer 逻辑移动到 @ObservableObject
.