0

有没有办法通过 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 只是为了表明我也尝试了另一种方法,但没有奏效

4

2 回答 2

0

您的代码似乎不必要地复杂(尽管我可能没有理解目标)。假设我们想要禁用我们的按钮 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 的事实。但这几乎不需要做这么简单的事情。

于 2021-04-10T03:18:04.960 回答
0

如果按钮是引用类型(即类),如果它是 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 */ }
于 2021-04-09T20:18:42.593 回答