【问题标题】:Swift - Pass inout parameter to scheduledTimerSwift - 将 inout 参数传递给 scheduleTimer
【发布时间】:2021-07-05 17:21:28
【问题描述】:

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

【问题讨论】:

    标签: ios swift parameters timer inout


    【解决方案1】:

    如果按钮是一个引用类型(即,一个类),如果它是一个 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 */ }
    

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-05-19
        • 2021-06-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-09-01
        • 1970-01-01
        相关资源
        最近更新 更多