gpt4 book ai didi

ios - ReactiveSwift/ReactiveCocoa : How to use UIButton disabled styling but not when Action is in progress?

转载 作者:塔克拉玛干 更新时间:2023-11-02 10:21:00 25 4
gpt4 key购买 nike

UIButton可以配置为在启用或禁用按钮时使用不同的样式、标题等,例如与 UIButton.setTitle(String, forState:UIControlState) .

ReactiveCocoa让我连接一个ReactiveSwift.Action到按钮的 reactive.pressed属性(property),如果Action禁用按钮将显示禁用样式:这太棒了!

但是一个ReactiveSwift.Action当它有 SignalProducer 时也被禁用进行中。这种锁定对于附加到缓慢操作(例如网络请求)的 UI 元素很有用,但当操作快速但不是即时时会产生不良的视觉闪烁。

一个简单的解决方法是不使用内置 UIButton禁用样式:相反,我们可以公开一个 Property<Bool>某处并同时使用它来启用/禁用 Action并明确更改按钮的样式。然而,这有点笨拙和尴尬,所以我的问题是:是否有一种“干净”的方式来组合 UIButton内置禁用样式,通过显式禁用 Action 来禁用按钮里面UIButton.reactive.pressed , 没有在操作进行时显示禁用样式?

最佳答案

我们最终使用了 application reserved area in the UIControlState bitset明确编码:

extension UIControlState {
public static var myActionIsExecuting = UIControlState(rawValue: 1 << 16)
}

public class ReactiveAwareStylingButton: UIButton {
override public var state: UIControlState {
return [super.state, customState]
}
var customState: UIControlState {
if reactive.pressed?.isExecuting.value == true {
return [.myActionIsExecuting]
}
return []
}
}

这样我们就可以使用标准的依赖于状态的样式选项,例如

button.setTitleColor(normalColor, for: .normal)
button.setTitleColor(normalColor, for: [.disabled, .myActionIsExecuting])
button.setTitleColor(disabledColor, for: .disabled)

如果需要,我们仍然可以选择在操作执行时使用禁用的样式(这可能适用于缓​​慢的操作,例如网络请求),只需忽略 .myActionIsExecuting 状态.

如果应用此技术,请注意编译器会乐于允许您犯语义错误:您可以将上述样式应用于 UIButton 实例,该实例不是自定义子类ReactiveAwareStylingButton,永远不会进入状态.myActionIsExecuting。您应该防止出现此错误,例如通过仅在采用 ReactiveAwareStylingButton 参数的函数中应用样式。

关于ios - ReactiveSwift/ReactiveCocoa : How to use UIButton disabled styling but not when Action is in progress?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50983762/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com