我的应用程序总体运行良好,具有所有功能。但是我添加的一个新按钮/功能会冻结设备上的应用程序,但在模拟器中可以完美运行。我在这里检查了类似的问题,并找到了一种重新启动设备和 Xcode 的通用解决方案。正如我预期的那样,它没有帮助。
我预料到了这种行为,因为这是第二次发生这种情况。该按钮在模拟器中工作并在设备上冻结。上次我注释掉了所有代码,直到找到导致问题的一行。这是定时器的初始化。将其移入体内就解决了问题。
import SwiftUI
import AVFoundation
import SwiftData
import CoreHaptics /// For making vibrations once the timer is run out
struct TimerTapasFullView: View {
@Environment(\.dismiss) var dismiss /// To be able to dismiss the view
@State var countdownTimer = 5 * 60 /// The actual seconds of the timer, being counted down/up
@State var timerRunning = true /// Var to set and see if timer is running
@State var gongSound: AVAudioPlayer? /// The Sound of the timer
@State private var hours: Int = 0 /// Vars for the picker wheel
@State private var minutes: Int = 0
@State private var seconds: Int = 0
@State private var brightnessLow = false /// Var for saving if the brightness button was used
@State private var engine: CHHapticEngine? /// The object creating the vibrations later on
@Environment(\.scenePhase) var scenePhase /// Var to keep track of state of app, to restart HapticEngine
/// Environment Objects
@EnvironmentObject var userStat: StatisticsObject /// Var to keep track of seconds using the Timer
@EnvironmentObject var envObject: EnvObject /// For getting FullDarkness, vibrateTimer
/// Variables from the Tapas for setting the timer
@State var asanas: [TapasAsana]
@State var asana: TapasAsana
@State var nextAsana = TapasAsana()
let path = Bundle.main.path(forResource: "bell_basu.mp3", ofType:nil)!
var body: some View {
/// Initiate the timer
let timer = Timer.publish(every: 1, on: .main, in: .common).autoconnect()
/// For calculating hours, minutes, seconds
let style = Duration.TimeFormatStyle(pattern: .minuteSecond)
//let formTimer = Duration.seconds(countdownTimer).formatted()
let formTimerShort = Duration.seconds(countdownTimer).formatted(style)
let url = URL(fileURLWithPath: path)
VStack {
... more code follows...
这是第一次导致此行为的行:
让计时器 = Timer.publish(every: 1, on: .main, in: .common).autoconnect()
现在我添加了新功能,包括这一行: @State var nextAsana = TapasAsana()
我对此有很多疑问。有谁知道为什么它在模拟器中完美运行而不是在设备上运行?这样我总是检查模拟器,当我在设备上的编码会话后检查时,我不知道我所做的许多更改中的哪一个导致了这种冻结。
发生这种情况时,Xcode 中的调试器不会显示任何内容。有什么方法可以让它更详细地显示设备上发生的情况吗?
您知道为什么会发生这种情况吗?我的代码是否有错误或者我是否使用了导致冻结的不良做法?
我将非常感激理解这个大问题,感谢您的帮助。
问题可能来自于初始化 TapasAsana() 或直接在主体中创建计时器。由于资源限制或重新渲染期间的重新初始化,这可能会导致设备出现意外行为。
修复:
@State private var timer = Timer.publish(every: 1, on: .main, in: .common).autoconnect()
@State var nextAsana: TapasAsana? = nil
init(asanas: [TapasAsana], asana: TapasAsana) {
self._nextAsana = State(initialValue: TapasAsana())
}
很可能是 TapasAsana() 或您的计时器逻辑导致冻结。避免直接在主体或状态变量中进行复杂的初始化。