You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SwiftUI中带.searchable的二级视图跳转三级视图时界面异常无响应

SwiftUI NavigationStack三级导航结合searchable引发的界面异常问题

我用SwiftUI的NavigationStack搭建了三级导航结构。在二级视图中添加了.searchable修饰符后,当搜索栏处于收起(等待输入)状态时跳转到三级视图,会出现三级视图布局越界、CPU占用率拉满至100%、应用完全无响应的情况。移除.searchable修饰符后,该异常完全消失,希望找到问题根源。

一级视图代码

struct MainDatabaseView: View {
    @EnvironmentObject var routeManager: RouteManager

    var body: some View {
            Form {
                NavigationLink(value: Route.mainDatabasePilot) {
                    Button {
                        routeManager.databaseRoute.append(Route.mainDatabasePilot)
                    } label: {
                        DatabaseLabelLineView(icon: "person.2", primaryText: "Pilots", secondaryText: "Manage pilot profiles, remarks, and images. Use them for auto-complete.")
                    }
                }
              
            }
            .navigationDestination(for: Route.self, destination: { $0 })
            .navigationTitle("Database")
        
    }
}

二级带.searchable修饰符的视图代码

struct MainTabPilotDatabaseView: View {
    @EnvironmentObject var pilotVM: PilotVM
    @EnvironmentObject var routeManager: RouteManager

    var body: some View {
        ZStack {
            listView()
            if pilotVM.pilotCollection.isEmpty {
                EmptyDataView(primaryText: "No Pilots Yet", secondaryText: "You can add pilots into database here. When importing existing logbooks, pilots will be automatically migrated", image: .emptyDatabase)
            }
        }
    }

    @ViewBuilder
    func listView() -> some View {
        List {
            ForEach(pilotVM.filteredPilots, id: \.id) { pilot in

                NavigationLink(value: Route.pilot(pilot: pilot)) {
                    PilotCell(pilot: pilot, isInDetailView: false) {}
                        .contentShape(Rectangle())
                        .swipeActions(edge: .trailing) { delete(for: pilot) }
                        .swipeActions(edge: .leading) { markFavorite(for: pilot) }
                }
            }
        }
        .searchable(text: $pilotVM.searchText, placement: .navigationBarDrawer(displayMode: .always), prompt: "Name, Base, Airline, Remarks")
        .overlay {
            if pilotVM.filteredPilots.isEmpty && !pilotVM.pilotCollection.isEmpty && !pilotVM.searchText.isEmpty {
                if #available(iOS 17.0, *) {
                    ContentUnavailableView.search(text: pilotVM.searchText)
                }
            }
        }
        .onAppear { pilotVM.fetchPilots() }
        .onDisappear { pilotVM.searchText = "" }
        .autocorrectionDisabled()
        .navigationTitle("Pilot Database")
        .toolbar {
            ToolbarItem(placement: .topBarTrailing) { addPilot() }
        }
    }
}

三级视图为简单的Form结构,我尝试注释掉三级和二级视图的内容后,确认异常仅在.searchable修饰符存在时触发。

堆栈调用信息

  • 截图1:显示大量重复的SwiftUI布局相关调用,包含UIView.layoutSubviews()、SwiftUI.ViewRendererHost.updateView()等循环执行的方法
  • 截图2:调用栈集中在UISearchBar的布局逻辑链上,呈现出明显的循环调用迹象

内容的提问来源于stack exchange,提问作者Petr Smejkal

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 16:57:09