SwiftUI Stepper在Mac(iPhone兼容模式)触发EXC_BAD_ACCESS崩溃
iOS应用在Mac兼容模式下Stepper崩溃的解决方案
一、检测应用是否处于Mac兼容模式
使用ProcessInfo的isiOSAppOnMac属性即可准确判断,该API从iOS 14.0开始支持,匹配你的部署目标:
let isRunningOnMacAsiOSApp = ProcessInfo.processInfo.isiOSAppOnMac
该属性仅在「专为iPhone设计」的iOS应用在Mac上运行时返回true,可区分原生Mac应用和常规iOS环境。
二、自定义Stepper替代方案
系统Stepper在Mac兼容模式下存在底层实现bug,我们可以实现一个轻量的自定义Stepper替代,保留核心功能同时避免崩溃:
import SwiftUI struct CustomStepper: View { let title: String @Binding var value: Int let range: ClosedRange<Int> let step: Int init(_ title: String, value: Binding<Int>, in range: ClosedRange<Int>, step: Int = 1) { self.title = title self._value = value self.range = range self.step = step } var body: some View { HStack { Text(title) Spacer() Button(action: { value = max(range.lowerBound, value - step) }) { Image(systemName: "minus.circle") } .disabled(value <= range.lowerBound) Text("\(value)") .frame(minWidth: 40, alignment: .center) Button(action: { value = min(range.upperBound, value + step) }) { Image(systemName: "plus.circle") } .disabled(value >= range.upperBound) } .padding() } } // 使用示例 struct ContentView: View { @State var someValue = 5 var body: some View { VStack { if ProcessInfo.processInfo.isiOSAppOnMac { CustomStepper("Stepper", value: $someValue, in: 0...10) } else { Stepper("Stepper", value: $someValue, in: 0...10) } } } }
这个自定义组件模拟了系统Stepper的核心逻辑:范围限制、步长增减,同时在Mac兼容模式下启用,iOS真机/模拟器保留原生Stepper体验,也可根据需求调整样式匹配系统风格。
补充说明
该崩溃是SwiftUI框架在Mac兼容模式下的已知bug,已在Xcode 14.3/15、macOS Ventura 13.3.1/Sonoma 14.1.2版本中被复现,自定义组件是目前最直接的规避方案。
内容的提问来源于stack exchange,提问作者lorenzo gonzalez
相关产品推荐
相关产品推荐

