![](/img/trans.png)
[英]"... is only available in iOS 13.0 or newer" in a project targeting iOS 15.0
[英]iOS 15 only view modifier causes crash on iOS 14 even with if #available(iOS 15.0, *)
我正在使用 SwiftUI 的拖放修飾符。 因為,iOS 15 提供了一個選項來自定義onDrag
修改器,我正在使用它,如下所示。
問題:我有一個if #available(iOS 15.0, *)
保護來選擇不同 iOS 版本的視圖。 但是,不知何故,我在 iOS 14.x 上的應用程序由於EXC_BAD_ACCESS (code=1, address=0x0)
錯誤而崩潰,因為它試圖找到新的 API 但它不存在於 Z1BDF605991920DB1ZEBCBD1440C 中。
@ViewBuilder
private func getRoutineCard(routine: RoutineInfo) -> some View {
if #available(iOS 15.0, *) {
newRoutineCard(routine: routine)
} else {
oldRoutineCard(routine: routine)
}
}
@available(iOS 15.0, *)
@ViewBuilder
private func newRoutineCard(routine: RoutineInfo) -> some View {
RoutineCard(routine: routine)
// This modifier is what crashes the app on iOS 14.x
// onDrag with a drag preview view not available in iOS 14.x
.onDrag({
dragReorder(draggedRoutine: routine)
}, preview: {
RoutineCardDragPreview(routine: routine)
})
.onDrop(of: [.text], delegate: ReorderDropDelegate(isDragging: $isDragging, draggedItem: $draggedItem, item: routine, haptics: haptics, onMove: updateOrder(routine:order:)))
}
@ViewBuilder
private func oldRoutineCard(routine: RoutineInfo) -> some View {
RoutineCard(routine: routine)
.onDrag { dragReorder(draggedRoutine: routine) }
.onDrop(of: [.text], delegate: ReorderDropDelegate(isDragging: $isDragging, draggedItem: $draggedItem, item: routine, haptics: haptics, onMove: updateOrder(routine:order:)))
}
我在尋找什么:基於 iOS 版本在兩個視圖之間進行選擇而不會導致崩潰的解決方法。
對於任何偶然發現這一點的人:
在 ViewBuilder 中使用 if #available(iOS 14.0, OSX 11.0, *) 時,應用程序在回退端運行時會崩潰。
Xcode 版本 13.1 及更高版本會發生這種情況。 (目前 Xcode 13.2.1)用 Xcode 13.0 構建測試,崩潰消失了。 我們認為這是因為 Xcode 中的編譯器優化錯誤。 對於開發版本,我們沒有這些崩潰。
更多信息: https://swiftui-lab.com/bug-os-check/和相同的答案: Swiftui 應用程序在 Z1BDF605991920DB11ZCBDF18508204C4EB 上使用不同的 SearchBar (ViewModifier) 崩潰
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.