JD.*_*JD. 13 ios tabview swiftui
如果有任何更改,我会在出现选项卡项时调用 API。为什么在调用 onDisappear 之后调用 onAppear?
这是一个简单的例子:
struct ContentView: View {
var body: some View {
TabView {
NavigationView {
Text("Home")
.navigationTitle("Home")
.onAppear {
print("Home appeared")
}
.onDisappear {
print("Home disappeared")
}
}
.tabItem {
Image(systemName: "house")
Text("Home")
}.tag(0)
NavigationView {
Text("Account")
.navigationTitle("Account")
.onAppear {
print("Account appeared")
}
.onDisappear {
print("Account disappeared")
}
}
.tabItem {
Image(systemName: "gear")
Text("Account")
}.tag(1)
}
}
}
Run Code Online (Sandbox Code Playgroud)
只需运行上面的代码,我们将在 onDisappear 之后看到 onAppear。
Home appeared
---After switch tab to Account---
Home disappeared
Account appeared
Home appeared
Run Code Online (Sandbox Code Playgroud)
有没有办法避免这种情况?
小智 7
这是非常烦人的错误,想象一下这种情况:
HomeviewonAppear方法包含一个重复获取数据的计时器。定时器通过切换到Account视图被无形地触发。
解决方法:
NavigationView内容创建一个独立的视图@Binding参数传递给独立视图例如:
struct ContentView: View {
@State var selected: MenuItem = .HOME
var body: some View {
return TabView(selection: $selected) {
HomeView(selectedMenuItem: $selected)
.navigationViewStyle(StackNavigationViewStyle())
.tabItem {
VStack {
Image(systemName: "house")
Text("Home")
}
}
.tag(MenuItem.HOME)
AccountView(selectedMenuItem: $selected)
.navigationViewStyle(StackNavigationViewStyle())
.tabItem {
VStack {
Image(systemName: "gear")
Text("Account")
}
}
.tag(MenuItem.ACCOUNT)
}
}
}
enum MenuItem: Int, Codable {
case HOME
case ACCOUNT
}
Run Code Online (Sandbox Code Playgroud)
主页视图:
struct HomeView: View {
@Binding var selectedMenuItem: MenuItem
var body: some View {
return Text("Home")
.onAppear(perform: {
if MenuItem.HOME == selectedMenuItem {
print("-> HomeView")
}
})
}
}
Run Code Online (Sandbox Code Playgroud)
账户视图:
struct AccountView: View {
@Binding var selectedMenuItem: MenuItem
var body: some View {
return Text("Account")
.onAppear(perform: {
if MenuItem.ACCOUNT == selectedMenuItem {
print("-> AccountView")
}
})
}
}
Run Code Online (Sandbox Code Playgroud)
我不确定您为什么会在应用程序中看到这种行为。但我可以解释为什么我在我的应用程序中看到它。
我的设置与您非常相似,并且在 iOS14 beta 上运行 iOS13 应用程序时看到了相同的行为。在我的主屏幕中,我有一个自定义选项卡栏,当显示详细信息屏幕时,它会以动画方式进出。触发隐藏 Tab Bar 的代码是在 Detail 屏幕的 .onAppear 中完成的。这会触发主屏幕重新绘制并调用 .onAppear。由于这个错误,我删除了动画并找到了更好的设置,并且主屏幕 .onAppear 停止被调用。
因此,如果您的帐户屏幕 .onAppear 中的某些内容在主屏幕上具有视觉效果,请尝试将其注释掉,看看是否可以解决问题。
祝你好运。
| 归档时间: |
|
| 查看次数: |
1335 次 |
| 最近记录: |