gpt4 book ai didi

swiftui - TabView 在 SwiftUI 中没有正确切换选项卡

转载 作者:行者123 更新时间:2023-12-04 07:15:43 25 4
gpt4 key购买 nike

我有一个奇怪的问题,我似乎无法用 SwiftUI 解决。我的 ContentView 中有一个 TabView,应用程序在聊天列表选项卡上加载了 3 个选项卡(聊天列表、用户列表和个人资料)。问题是,当我选择第二个选项卡(用户列表)时,它会在一瞬间转到该选项卡,然后立即返回聊天列表。这对我来说没有任何意义。两个主要选项卡进行 API 调用以从服务器获取信息,除了第一次单击之外,一切都运行良好。
应用程序加载完毕,我单击用户列表选项卡,它会显示片刻,然后返回聊天列表选项卡。然后我可以再次单击用户列表选项卡,它将转到该选项卡并停留在那里,但第一次单击该选项卡总是会将您返回到聊天列表选项卡。
我会发布我的一些代码,希望有人能够看到我做错了什么,因为我肯定不能。
内容 View

struct ContentView: View {
@Environment(\.managedObjectContext) private var viewContext

@State var selectedTab = 0
@State var setup: Bool = false
@State var notificationChatID: String = ""

@ObservedObject var userModel: UserModel = UserModel()
@ObservedObject var chatModel: ChatModel = ChatModel()
@ObservedObject var appState: AppState = AppState.shared

var pushNavigationBinding : Binding<Bool> {
.init { () -> Bool in
appState.selectedChatID != nil
}
set: { (newValue) in
if !newValue {
appState.selectedChatID = nil
}
}
}

let settings = UserDefaults.standard

var body: some View {
ZStack {
if setup {
TabView(selection: $selectedTab) {
ChatList(launchedChatID: appState.selectedChatID ?? "", userModel: userModel, chatModel: chatModel)
.tabItem {
Image(systemName: "message.circle.fill")
Text("Active Chats")
}
UserList(userModel: userModel)
.tabItem {
Image(systemName: "person.3.fill")
Text("User List")
}
ProfileView()
.tabItem {
Image(systemName: "person.crop.circle")
Text("Profile")
}
}
} else {
Onboarding(userModel: userModel, isSetup: $setup)
}
}
.onReceive(NotificationCenter.default.publisher(for: Notification.Name.NewMessage), perform: { notification in
if let info = notification.userInfo {
let chatID = info["chatID"] as? String ?? ""
if chatID != "" {
chatModel.selectedChat = chatID
appState.selectedChatID = chatID
self.notificationChatID = chatID
}
}
})
}
然后我的用户列表
struct UserList: View {

@ObservedObject var userModel: UserModel
@ObservedObject var chatModel: ChatModel = ChatModel()

@State var action: Int? = -1

var body: some View {
NavigationView {
VStack {
List {
ForEach(0..<userModel.arrayOfUsers.count, id: \.self) { index in
ZStack(alignment: .leading) {
NavigationLink(
destination: ChatView(model: chatModel, userModel: userModel, item: $action),
tag: index,
selection: $action
) {
EmptyView().frame(width: .zero, height: .zero, alignment: .center)
}
Button(action: {
print("You selected \(userModel.arrayOfUsers[index].name)")
userModel.selectedUserName = userModel.arrayOfUsers[index].name
userModel.selectedUserID = userModel.arrayOfUsers[index].id
self.action = index
}) {
Text(userModel.arrayOfUsers[index].name)
}
}
}
}
Spacer()
}.navigationBarTitle(Text("Users"), displayMode: .inline)
}.onAppear() {
print("Inside the userlist on appear")
if userModel.arrayOfUsers.count == 0 {
ApiService.getUsers() { (res) in
switch(res) {
case .success(let response):
print("In success")
let users = response!.users!
DispatchQueue.main.async {
for user in users.users {
userModel.arrayOfUsers.append(user)
}
}
break
case .failure(let error):
print("Error getting users")
print(error)
break
}
}
}
}
}
}
我的 userModel.arrayOfUsers@Published用户模型
class UserModel: ObservableObject {
var name: String = ""
var id: String = ""
var myUserID: String = ""
@Published var arrayOfUsers: [User] = []
var selectedUserID: String = ""
var selectedUserName: String = ""
}
在 Xcode 的控制台中,我看到
Inside the userlist on appear
...(network stuff)
In the success
In the on appear in ChatList
所以它正在加载用户列表,它显示了对我的 API 的网络调用,它显示了 In the success从 UserList 中的 API 调用,接下来就是回到 In the on appear in ChatList我不明白为什么它把我踢回聊天列表。

最佳答案

您将 TabView 的当前选项卡绑定(bind)到 $selectedTab ,但没有向 SwiftUI 提供有关在用户更改选项卡时如何更改该值的任何信息。所以,因为selectedTab没有改变,当绘图系统来审查你的 View 结构时,它仍然得出你想看到第一个选项卡的结论。
您应该添加 .tag每个 .tabItem 之后的修饰符告诉 SwiftUI 什么值代表每个选项卡。然后,当用户选择每个选项卡时,selectedTab将被更新,选项卡选择将“坚持”。
例如:

TabView(selection: $selectedTab) {
ChatList(launchedChatID: appState.selectedChatID ?? "", userModel: userModel, chatModel: chatModel)
.tabItem {
Image(systemName: "message.circle.fill")
Text("Active Chats")
}
.tag(0)
UserList(userModel: userModel)
.tabItem {
Image(systemName: "person.3.fill")
Text("User List")
}
.tag(1)
ProfileView()
.tabItem {
Image(systemName: "person.crop.circle")
Text("Profile")
}
.tag(2)
}
请注意,除非您以某种方式坚持用户的选择(例如,通过使用 @SceneStorage 声明您的状态变量),否则您可以通过不使用 selection 来获得相同的效果。论据。

关于swiftui - TabView 在 SwiftUI 中没有正确切换选项卡,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68777434/

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