SwiftUI中带.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
相关产品推荐
相关产品推荐

