簡體   English   中英

Swift - 將 inout 參數傳遞給 scheduleTimer

[英]Swift - Pass inout parameter to scheduledTimer

有沒有辦法通過 scheduleTimer 方法傳遞 inout 參數? 我想要一個特定的值(在計時器用完之前禁用按鈕)。

func Timer(Hz:TimeInterval, Activate: inout Bool, time:Double=10){
    let info = ProcessInfo.processInfo
    let begin = info.systemUptime
    var A=0
    // do something
    var diff = (info.systemUptime - begin)
    print("Time runs\n")
    let timer=Timer.scheduledTimer(withTimeInterval: Hz, repeats: true) { timer in
        diff=(info.systemUptime - begin)
        if (diff>=time){
            timer.invalidate()
            print("Finished")
            Activate = !Activate
            A=1
        }
    }
    if (A==1){
        print("Will never happen")
    }

    
}

Var A 只是為了表明我也嘗試了另一種方法,但沒有奏效

如果按鈕是引用類型(即類),如果它是 UIKit 或 AppKit 類型,則可以將其傳入,但有一種更通用的方法可能會更好。 傳入一個閉包作為完成處理程序:

func Timer(Hz:TimeInterval, time:Double=10, onCompletion handler: @escaping () -> Void){
    let info = ProcessInfo.processInfo
    let begin = info.systemUptime
    var A=0
    // do something
    var diff = (info.systemUptime - begin)
    print("Time runs\n")
    let timer=Timer.scheduledTimer(withTimeInterval: Hz, repeats: true) { timer in
        diff=(info.systemUptime - begin)
        if (diff>=time){
            timer.invalidate()
            print("Finished")
            A=1
            handler() // <- Call completion handler here
        }
    }
    if (A==1){
        print("Will never happen")
    }
}

然后你可以像這樣禁用按鈕:

Timer(Hz: hz, time: time) { myButton.isEnabled = false /* or whatever else you want to do */ }

您的代碼似乎不必要地復雜(盡管我可能沒有理解目標)。 假設我們想要禁用我們的按鈕 10 秒鍾,然后應該再次啟用它。 那我們就說

    self.myButton.isEnabled = false
    self.toggleEnabled(self.myButton, after:10)

其中toggleEnabled看起來像這樣:

func toggleEnabled(_ enabled:UIButton, after t:Double) {
    Timer.scheduledTimer(withTimeInterval: t, repeats: false) { _ in
        enabled.isEnabled.toggle()
    }
}

如果你真的想要,你可以使用一個協議來隱藏toggleEnabled這是一個 UIButton 的事實。 但這幾乎不需要做這么簡單的事情。

暫無
暫無

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

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