Tabview 重置 SwiftUI 时索引超出范围

问题描述

我正在使用 3 tabview 并在双击时重置那里的 id 方式如下:-

Tabview Tab 1 -> 前往 B 类导航链接 -> 前往 C 类导航链接

Tabview Tab 2 -> 前往 D 班导航链接 -> 前往 E 班导航链接

Tabview Tab 3 -> 前往 F 班导航链接 -> 前往 G 班导航链接

当我们双击 tabview 图标然后更改 tabview 1 和 3 的选择时,它的工作正常,它们会自动重定向到 Tabview 选项卡 1 和 Tabview 选项卡 3 屏幕

但是在 Tabview 2 屏幕中,当我们重置 Tabview 选项卡 2 时,我得到了索引超出范围。在 Tabview 的第二个中,包括搜索显示在列表中的用户以及绑定变量的更多详细信息,请检查我的代码

注意:- 我崩溃了,但我不知道如何处理。

首先,我们通过搜索获得 10 计数并清除文本字段,然后我们获得 1 计数,然后重置 tabview,我的崩溃指数超出范围。

HomeView1 类

import SwiftUI
import Firebase

struct HomeView1: View {

@State private var day = 0
@State private var tabSelection = 0
@State private var resetNavigationID = UUID()
@State private var resetNavigationID1 = UUID()
@State private var resetNavigationID2 = UUID()
@State private var selection = 0

var body: some View {
    let selectable = Binding(
        get: {UserStore.shared.saveTabBarUniqueIdForSecond},set: {
            if $0 == 2 {
                // For Profile Screen
                if UserStore.shared.isForSecondTabId == 2 {
                    UserStore.shared.saveTabBarUniqueIdForSecond = $0
                    self.resetNavigationID1 = UUID()
                    UserStore.shared.isForSecondTabId = 3
                }else{
                    UserStore.shared.isForSecondTabId = 2
                }
                UserStore.shared.isForFirstTabId = 0
                UserStore.shared.isForThirdTabId = 0
            } else if $0 == 1 {
                if UserStore.shared.isForFirstTabId == 1 {
                    UserStore.shared.saveTabBarUniqueIdForSecond = $0
                    self.resetNavigationID = UUID()
                    UserStore.shared.isForFirstTabId = 5
                } else {
                    UserStore.shared.isForFirstTabId = 1
                }
                UserStore.shared.isForSecondTabId = 0
                UserStore.shared.isForThirdTabId = 0
            } else if $0 == 3 {
                if UserStore.shared.isForThirdTabId == 3 {
                    if UserStore.shared.isRootClassSearch {
                        UserStore.shared.saveTabBarUniqueIdForSecond = $0
                        self.resetNavigationID2 = UUID()
                        UserStore.shared.isForThirdTabId = 6
                    }
                } else {
                    UserStore.shared.isForThirdTabId = 3
                }
                UserStore.shared.isForFirstTabId = 0
                UserStore.shared.isForSecondTabId = 0
            }
            UserStore.shared.saveTabBarUniqueIdForSecond = $0
        })
    TabView(selection: selectable) {
        First_Ride_tab1().id(self.resetNavigationID)
            .tabItem {
                Image(systemName: "bicycle")
                Text("My Home")
            }.tag(1)
        NavigationView {
            FollowerScreen(currentDay: $day).id(self.resetNavigationID2)
        }.hiddenNavigationBarStyle()
        .tabItem {
            Image(systemName: "person.2")
            Text("User")
        }.tag(3)
        NavigationView {
            ProfileScreen1().id(self.resetNavigationID1)
        }.hiddenNavigationBarStyle()
        .tabItem {
            Image(systemName: "person")
            Text("Section")
        }.tag(2)
    }.accentColor(.white)
    .onAppear(perform: {
        UIScrollView.appearance().bounces = true
        self.resetNavigationID = UUID()
        UserStore.shared.saveTabBarUniqueIdForSecond = 0
      })
     }
    }

First_Ride_tab1 类

    struct First_Ride_tab1: View {
    var body: some View {
    NavigationView {
        ZStack {
            Color.init("DTR-MainThemeBackground")
                .edgesIgnoringSafeArea(/*@START_MENU_TOKEN@*/.all/*@END_MENU_TOKEN@*/)
        }
    }
    }
    }

ProfileScreen1 类

  struct ProfileScreen1: View {
  var body: some View {
    ZStack {
        Color.init("DTR-MainThemeBackground")
            .ignoresSafeArea()
      }
     }
    }

FollowerScreen1 类

struct FollowerScreen1: View {

@Binding var currentDay : Int
@Environment(\.presentationMode) var presentationMode: Binding<PresentationMode>
@StateObject var userSearchModel = UserSearchviewmodel()
@State private var titleDtr: String = ""
@State private var showSearchTxtFld: Bool = false
@State private var clearallText: Bool = false
var callApiIfrequired: Bool = true
@State private var showActivity = false
@State private var totalCountArray = 0
@State var comesFromChatScreen = false
@State var updateKeyboard = true

@State private var page: Int = 0
@State private var totalUserCount: Int = 0
@State private var showListOrNot = false
private let pageSize: Int = 20

var body: some View {
    ZStack {
        vstack(spacing: 15) {
            HStack {
                CustomTxtfldForFollowerScrn(isDeleteAcntScreen: .constant(false),text:  $titleDtr,clearallText: $clearallText,isFirstResponder: $updateKeyboard,completion: { (reponse) in
                    updateKeyboard = true
                    if titleDtr.count >= 3 {
                        page = 0
                        showActivity = true
                        totalCountArray = 0
                        showListOrNot = true
                        userSearchModel.userProfiles.removeAll()
                        userSearchModel.searchUsers1(searchKeyboard: titleDtr,data: ["page": "0","hitsPerPage":20],completion: { response in
                            totalUserCount = response - 1
                        })
                        
                    }else if titleDtr.count <= 3 {
                        dispatchQueue.main.async {
                            page = 0
                            showActivity = false
                            totalCountArray = 0
                            showListOrNot = false
                        }
                    }
                })
                
                if self.showActivity {
                    ProgressView()
                        .progressViewStyle(CircularProgressViewStyle(tint: Color.white))
                        .frame(width: 30,height: 30)
                }
                
                Button(action: {
                    withAnimation {
                        page = 0
                        totalCountArray = 0
                        clearallText = true
                        updateKeyboard = false
                        showListOrNot = false
                    }
                }) {
                    Image(systemName: "xmark")
                        .aspectRatio(contentMode: .fit)
                }
            }
            .padding()
            .cornerRadius(10)
            .foregroundColor(.white)
            .padding(.all)
            .frame(height: 50)
            vstack(spacing:0) {
                List {
                    if showListOrNot {
                            ForEach(userSearchModel.userProfiles.indices,id: \.self) { indexs in
                                    if userSearchModel.userProfiles.count > indexs {
                                        UserSearchView(day:$currentDay,userProfiles:$userSearchModel.userProfiles[indexs],showProfileScreen:.constant(false)).listRowInsets(.init(top: 0,leading: 0,bottom: 0,trailing: 0))
                                            .onAppear {
                                            if ((userSearchModel.userProfiles.endindex - 1) == indexs) {
                                                dispatchQueue.main.asyncAfter(deadline: dispatchTime.Now() + 2) {
                                                    if userSearchModel.userProfiles.count != totalUserCount && userSearchModel.userProfiles.count < totalUserCount{
                                                        if titleDtr != "" {
                                                            page += 1
                                                            userSearchModel.searchUsers1(searchKeyboard: titleDtr,data: ["page": "\(page)",completion: { response in
                                                            })
                                                        }
                                                    }
                                                }
                                            }
                                        }.listRowBackground(Color.clear)
                                        if ((userSearchModel.userProfiles.endindex - 1) == indexs) {
                                            if userSearchModel.userProfiles.count != totalUserCount && userSearchModel.userProfiles.count < totalUserCount{
                                                ShowLoadingText().listRowBackground(Color.clear).frame(alignment: .center)
                                            }
                                        }
                                    }
                                
                            }
                        
                    }
                }.listStyle(PlainListStyle()).listRowBackground(Color.clear)
            }
        }
    }
    .ondisappear{
        updateKeyboard = false
    }
    .onReceive(userSearchModel.$userProfiles,perform: { (retnrUsrProfile) in
        if retnrUsrProfile.count > 0 {
            if retnrUsrProfile.count == totalCountArray {
                totalCountArray = 0
                showActivity = false
            }else{
                totalCountArray += 1
                if retnrUsrProfile.count == totalCountArray {
                    totalCountArray = 0
                    showActivity = false
                }
            }
        }
    })
    
    .navigationBarBackButtonHidden(true)
    .navigationBarTitle("",displayMode: .inline)
    .navigationBarItems(leading:
                            Button(action: {
                                UIApplication.shared.endEditing()
                                
                                if comesFromChatScreen {
                                    self.presentationMode.wrappedValue.dismiss()
                                }
                            }) {
                                HStack {
                                    if comesFromChatScreen {
                                        Image(systemName: "arrow.left")
                                    }
                                    Text("Find and Invite")
                                }})
    
       }
     } 

UserStore 类

 class UserStore: NSObject {

static let shared = UserStore()
private override init(){
    super.init()
}

let UserDeafult = UserDefaults.standard
let ForFirstTabId = "First_Tab_Id"
let ForThirdTabId = "Third_Tab_Id"
let ForSecondTabId = "Second_Tab_Id"
let SaveTabBarUniqueIdForSecond = "SaveTab_Unique_Second"
let SaveRootClassSearch = "Save_Root_Class_Search"

//MARK:- Is For First Tab Id
var isForFirstTabId: Int {
    get {
        return UserDefaults.standard.value(forKey: ForFirstTabId) as? Int ?? 0
    }
    set {
        UserDefaults.standard.set(newValue,forKey: ForFirstTabId)
    }
}

//MARK:- Selected Tab Id
var isForSecondTabId: Int {
    get {
        return UserDefaults.standard.value(forKey: ForSecondTabId) as? Int ?? 0
    }
    set {
        UserDefaults.standard.set(newValue,forKey: ForSecondTabId)
    }
}

//MARK:- Is For First Tab Id
var isForThirdTabId: Int {
    get {
        return UserDefaults.standard.value(forKey: ForThirdTabId) as? Int ?? 0
    }
    set {
        UserDefaults.standard.set(newValue,forKey: ForThirdTabId)
    }
}


var saveTabBarUniqueIdForSecond: Int {
    get {
        return UserDefaults.standard.value(forKey: SaveTabBarUniqueIdForSecond) as? Int ?? 0
    }
    set {
        UserDefaults.standard.set(newValue,forKey: SaveTabBarUniqueIdForSecond)
    }
}

//MARK:- Is For First Tab Id
var isRootClassSearch: Bool {
    get {
        return UserDefaults.standard.value(forKey: SaveRootClassSearch) as? Bool ?? false
    }
    set {
        UserDefaults.standard.set(newValue,forKey: SaveRootClassSearch)
    }
   }
}

有人可以向我解释如何使用已发布数组的绑定变量处理列表中超出范围的崩溃索引。我已经尝试通过上面的方法实现,但还没有结果。

任何帮助将不胜感激。

提前致谢。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)