簡體   English   中英

SwiftUI 中的計時器崩潰屏幕

[英]Timer crashing screens in SwiftUI

我有一個應用程序使用計時器以編程方式在入職屏幕上的視圖之間滾動。 從入職屏幕,我可以進入登錄然后注冊屏幕(或個人資料然后我的帳戶屏幕)。 在這兩種方式中,當打開登錄屏幕並單擊注冊時,注冊屏幕會出現但隨后消失並讓我重新登錄(當我嘗試從個人資料屏幕進入我的帳戶屏幕時也會發生同樣的情況)。 請檢查隨附的 gif。

我搜索了整個網絡,沒有發現任何類似的問題。

注意:我正在使用 NavigationLink 在屏幕之間導航,並且我還嘗試同時使用 Timer 和 Timer.TimerPublisher 導致我得到相同的結果,一旦計時器觸發,屏幕就會崩潰。

注意:刪除計時器(或 onReceive 中的代碼)時,一切正常。 我也懷疑這個問題可能與menuIndex有關

struct OnboardingView: View {

//MARK: - PROPERTIES

@State var menuIndex = 0
@State var openLogin = false
let timer = Timer.publish(every: 4, on: .main, in: .common).autoconnect()

//MARK: - BODY

var body: some View {
    
    NavigationLink(destination: LoginView(), isActive: $openLogin) {}
    
    VStack (spacing: 22) {
        
        ProfileButton(openProfile: $openLogin)
            .frame(maxWidth: .infinity, alignment: .trailing)
            .padding(.horizontal, 22)
            
            OnboardingMenuItem(text: onboardingMenu[menuIndex].title, image: onboardingMenu[menuIndex].image)
                .frame(height: 80)
                .animation(.easeInOut, value: menuIndex)
                .onReceive(onboardingVM.timer) { input in
                    if menuIndex < onboardingMenu.count - 1 {
                        menuIndex = menuIndex + 1
                    } else {
                        menuIndex = 0
                    }
                }
            ...
        }
    }
}

你只能有一個細節NavigationLink ,如果你想要更多,你必須設置isDetailLink(false) ,這就是你看到故障的原因。

僅供參考,您的計時器需要在@State中,否則每次 View 初始化時它都會從零開始,例如在父View的狀態更改時。 解決這個問題的標准方法是將相關屬性分組到它們自己的結構中,例如

struct OnboardingViewConfig {
    var menuIndex = 0
    var openLogin = false
    let timer = Timer.publish(every: 4, on: .main, in: .common).autoconnect()

    // mutating func exampleMethod(){} 
}

struct OnboardingView: View {

    @State var config = OnboardingViewConfig()

    ...

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM