Reactivecocoa: `рдПрдХреНрд╢рди` рдХреЗ рд▓рд┐рдП рдмрд╛рдЗрдВрдбрд┐рдВрдЧ рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░реЗрдВред

рдХреЛ рдирд┐рд░реНрдорд┐рдд 4 рдЕрдХреНрддреВре░ 2016  ┬╖  22рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: ReactiveCocoa/ReactiveCocoa

рджреЛ рдПрдкреАрдЖрдИ рд╣реИрдВ рдЬреЛ рдХрдорд╛рдВрдб рдкреИрдЯрд░реНрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред рдЬреИрд╕рд╛ рдХрд┐ @sharplet рдиреЗ рдХрд╣рд╛, рдЗрдиреНрд╣реЗрдВ ReactiveObjC рд╕реЗ рд▓рд╛рдпрд╛ рдЧрдпрд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП button.rac_command ред

extension Reactive where Host: UIButton {
    public var pressed: MutableProperty<CocoaAction> { ... }
}

extension Reactive where Host: UIBarButtonItem {
    public var pressed: MutableProperty<CocoaAction> { ... }
}

рдПрдХ рдордЬрдмреВрдд рд╕рдВрджрд░реНрдн рдХреЗ рд╕рд╛рде Action рд╕реНрд╡рд╛рдорд┐рддреНрд╡ рд╡рд╛рд▓реЗ рджреГрд╢реНрдп рдХреЛ рджреЗрдЦрдирд╛ рдЧрд▓рдд рд▓рдЧрддрд╛ рд╣реИред Action (рдЕрдкреНрд░рддреНрдпрдХреНрд╖ рд░реВрдк рд╕реЗ CocoaAction рдорд╛рдзреНрдпрдо рд╕реЗ) рдХрд╛ рд╕реНрд╡рд╛рдорд┐рддреНрд╡ рдЗрд╕рдХреА рдореВрд▓ рдкрд░рдд рдкрд░ рдЫреЛрдбрд╝ рджрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП (рдЪрд╛рд╣реЗ рд╡рд╣ рд╡реАрд╕реА рдпрд╛ рд╡реАрдПрдо рд╣реЛ)ред

рдЗрд╕рд▓рд┐рдП, @liscio рдФрд░ @sharplet рдХреЗ рд╕рд╛рде рд▓рдВрдмреА рдЪрд░реНрдЪрд╛ рдХреЗ рдмрд╛рдж, рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ Action рдХреЗ рд▓рд┐рдП UIControl рдФрд░ NSControl s рдХреЗ рд╕рд╛рде рдЬреБрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдирдпрд╛ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рддреИрдпрд╛рд░ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рд╣реИред рдЕрд╡рдзрд╛рд░рдгрд╛ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реИ:

extension Reactive where Base: UIControl {
    /// Create a trigger signal for a specific set of control events.
    public func trigger(for controlEvents: UIControlEvents) -> Signal<(), NoError>

    /// The action is weakly referenced internally.
    public func setAction<Input, Output, Error>(_ action: Action<Input, Output, Error>, for controlEvents: UIControlEvents, inputTransform: (Self, UIControlEvents) -> Input)

    public func removeAction()

    /// ... some convenience overloads of `setAction(_:for:inputTransform:)`.
}

рдЗрд╕ рдПрдкреАрдЖрдИ рдХреЗ рд╕рд╛рде, рд╣рдо рдпреВрдЖрдИрд╕реАрдВрдЯреНрд░реЛрд▓ рдФрд░ рдПрдирдПрд╕рд╕реАрдВрдЯреНрд░реЛрд▓ рдЙрдкрд╡рд░реНрдЧреЛрдВ рд╕реЗ рд╕рднреА Action рдмрд╛рдзреНрдпрдХрд╛рд░реА рд▓рдХреНрд╖реНрдпреЛрдВ рдХреЛ рд╣рдЯрд╛ рджреЗрдВрдЧреЗ, рдХреНрдпреЛрдВрдХрд┐ рдПрдкреАрдЖрдИ рдХреЛ рдЙрди рд╕рднреА рдХреЛ рдХрд╡рд░ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдерд╛ред

рдЕрдзрд┐рдХ рдЕрд░реНрде рдореЗрдВ, рд╣рдо @IBAction рдФрд░ @IBOutlet рдкреАрдЫреЗ рд▓рдХреНрд╖реНрдп-рдХреНрд░рд┐рдпрд╛ рдкреИрдЯрд░реНрди рдХреА рдирдХрд▓ рдХрд░реЗрдВрдЧреЗред

рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдмрд┐рд▓реНрдбрд░ рдореЗрдВ, рд╣рдо UIButton рдХреЗ _Sent Action_ рдХреЛ UIViewController рдХреЗ _Received Action_ ( @IBAction рд╡рд┐рдзрд┐) рд╕реЗ рдмрд╛рдБрдз рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ UIButton рдХрдордЬреЛрд░ рд╕рдВрджрд░реНрднрд┐рдд рд▓рдХреНрд╖реНрдп рдХреЛ рдПрдХ рд╕рдВрджреЗрд╢ рднреЗрдЬрддрд╛ рд╣реИред

рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╣рдо рдирд┐рдпрдВрддреНрд░рдгреЛрдВ рдкрд░ рдШрдЯрдирд╛ рд╕рдВрдХреЗрддреЛрдВ рдХреЗ рд╕рдВрдЧреНрд░рд╣ рдХрд╛ рдкрд░реНрджрд╛рдлрд╛рд╢ рдХрд░реЗрдВрдЧреЗред рдмрд╛рдзреНрдпрдХрд╛рд░реА рд▓рдХреНрд╖реНрдп рдХреЗ рд░реВрдк рдореЗрдВ Action s рдХреЗ рд╕рд╛рде, Action рднреВрдорд┐рдХрд╛ @IBAction рд╕рдорд╛рди рд╣реЛ рд╕рдХрддреА рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП:

// Received Action <~ Sent Action
commitAction <~ confirmButton.touchUpInside

// The reverse `isEnabled` binding is now explicit & optional.
confirmButton.isEnabled <~ commitAction.isEnabled

// OR

confirmButton.setAction(commitAction, for: .touchUpInside)

рдЬреЛ рдХреЗ рд╕рдордХрдХреНрд╖ рд╣реИрдВ

confirmButton.rac_pressed.value = CocoaAction(commitAction)

рд▓реЗрдХрд┐рди рд╣рдорд╛рд░реЗ рдХрдордЬреЛрд░-рд╕реЗ-рдХрдордЬреЛрд░ рдмрд╛рдзреНрдпрдХрд╛рд░реА рд╢рдмреНрджрд╛рд░реНрде рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдПрдХ рдЕрд▓рдЧ рд╕реНрд╡рд╛рдорд┐рддреНрд╡ рдХреЗ рд╕рд╛рдеред

рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА

рдлрд┐рд░ рдЫреБрдкрд╛ рд▓реЗрдВрдЧреЗред рдЗрд╕реЗ рд╕рд░рд▓ рд░рдЦреЗрдВред

рд╕рднреА 22 рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

рдпрд╣ рди рднреВрд▓реЗрдВ рдХрд┐ рд╣рдореЗрдВ рд╕рдорд╛рди рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреЗ рд▓рд┐рдП рднреА рдЗрд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА:

confirmButton.rac.isEnabled <~ commitAction.isEnabled

рд╣рдореНрдо, рдореИрдВрдиреЗ рдЗрд╕реЗ рдЕрдирджреЗрдЦрд╛ рдХрд░ рджрд┐рдпрд╛ред рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣рдореЗрдВ Action рд╕рд╛рде рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред

@andersio рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЗрд╕рдХрд╛ рдХреНрдпрд╛ рдорддрд▓рдм рд╣реИ, рдФрд░ рдЗрд╕рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рдпрд╣ рдореБрджреНрджрд╛ рдХреНрдпреЛрдВ рдмрдВрдж рд╣реЛ рдЧрдпрд╛ред

@sharplet рдХреНрдпрд╛ рд▓рд╛рддрд╛ рд╣реИ, рдЗрд╕реЗ isEnabled рдЗрдирд▓реЗрдЯ рдореЗрдВ рдЕрд▓рдЧ рдХрд░рдирд╛ рдареАрдХ рд╣реИред

рдЙрд╕ рддрдереНрдп рдХреЛ рдПрдХ рд╕реБрд╡рд┐рдзрд╛ рдкрджреНрдзрддрд┐/рдкреИрдЯрд░реНрди рдореЗрдВ рдЫрд┐рдкрд╛рдирд╛, рдореЗрд░реА рд░рд╛рдп рдореЗрдВ, рд╣рдореЗрдВ рдЬреНрдпрд╛рджрд╛ рдирд╣реАрдВ рдЦрд░реАрдж рд░рд╣рд╛ рд╣реИред

https://github.com/ReactiveCocoa/ReactiveCocoa/pull/3210/commits/f983a746f915a9a517e9e076c19581724075c562 рдореЗрдВ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЧрдпрд╛

рдПрдХ рдордЬрдмреВрдд рд╕рдВрджрд░реНрдн рдХреЗ рд╕рд╛рде рдХрд╛рд░реНрд░рд╡рд╛рдИ рдХреЗ рдорд╛рд▓рд┐рдХ рд╣реЛрдиреЗ рдХреЗ рд╡рд┐рдЪрд╛рд░ рдХреЛ рдЧрд▓рдд рд▓рдЧрддрд╛ рд╣реИред рдХрд╛рд░реНрд░рд╡рд╛рдИ рдХрд╛ рд╕реНрд╡рд╛рдорд┐рддреНрд╡ (рдЕрдкреНрд░рддреНрдпрдХреНрд╖ рд░реВрдк рд╕реЗ CocoaAction рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ) рдЗрд╕рдХреА рдореВрд▓ рдкрд░рдд рдкрд░ рдЫреЛрдбрд╝ рджрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП (рдЪрд╛рд╣реЗ рд╡рд╣ VC рдпрд╛ VM рд╣реЛ)ред

рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдореИрдВ рд╕рд╣рдордд рд╣реВрдВред рдпрд╣ рдЖрдкрдХреЛ рдЧрд▓рдд рдХреНрдпреЛрдВ рд▓рдЧрддрд╛ рд╣реИ?

рдХрдордЬреЛрд░ рд╕рдВрджрд░реНрдн рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рдПрдкреАрдЖрдИ рдХрд╛ рдПрдХ рдЫреЛрдЯрд╛ рд╕рд╛ рд╣рд┐рд╕реНрд╕рд╛ рд╣реИ, рдЬреЛ UIControl рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЗ рдПрдХ рд╕реЗрдЯ рдХреЛ рдзрдХреНрдХрд╛ рджреЗрддрд╛ рд╣реИ рдЬреЛ рдХрдорд╛рдВрдб рдкреИрдЯрд░реНрди ( Action рдорд╛рдзреНрдпрдо рд╕реЗ) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕рднреА рдирд┐рдпрдВрддреНрд░рдгреЛрдВ рдХреЛ рдХрд╡рд░ рдХрд░рддрд╛ рд╣реИред

рд░реЗрдХреНрд╕ рдореЗрдВ, рдпрд╣ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд╕рд╛рде UIButton рдХреЗ рд▓рд┐рдП рд╡рд┐рд╢рд┐рд╖реНрдЯ рдерд╛ред

AFAIK, рдПрдХ Action рдЖрдорддреМрд░ рдкрд░ рдПрдХ рдХрдорд╛рдВрдб рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рддрд╛ рд╣реИ, рдПрдХ рджреГрд╢реНрдп рдореЙрдбрд▓ рдХреЗ рд╕реНрд╡рд╛рдорд┐рддреНрд╡ рдореЗрдВ рд╣реИ, рдФрд░ рдЗрд╕рдХреА рд╕реНрдерд┐рддрд┐ рд╕реЗ/рдкрд░ рдЖрдВрддрд░рд┐рдХ рдФрд░ рдмрд╛рд╣рд░реА рджреЛрдиреЛрдВ рдирд┐рд░реНрднрд░рддрд╛рдПрдВ рд╣реЛрдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИред рдХреЛрдХреЛ рд▓рдХреНрд╖реНрдп-рдХреНрд░рд┐рдпрд╛ рдкреИрдЯрд░реНрди рдХреА рддрд░рд╣, рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдпрд╣ рдПрдХ рд╕реНрдкрд╖реНрдЯ рд╕рдВрджрд░реНрдн рд╣реЛрдиреЗ рдкрд░ рдПрдХ рдордЬрдмреВрдд рд╕рдВрджрд░реНрдн рдХреНрдпреЛрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред

рдПрдХ рдордЬрдмреВрдд рд╕рдВрджрд░реНрдн рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рд░реЗрдХреНрд╕ рдПрдкреАрдЖрдИ рд╕рдВрднрд╛рд╡рд┐рдд рд░реВрдк рд╕реЗ CocoaAction рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд╛ рдПрдХ рд╢рд┐рд▓реНрдк рд╣реИ, рдЬрд┐рд╕реЗ рдмрдирд╛рдП рд░рдЦрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рддрд╛рдХрд┐ рдореВрд▓реНрдпреЛрдВ рдХреЛ рд▓рдкреЗрдЯреЗ рдЧрдП Action рдкреНрд░рдЪрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗред

рдЗрд╕рдХреЗ рдмрдЬрд╛рдп рдпрд╣рд╛рдВ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рдПрдкреАрдЖрдИ рд╕реАрдзреЗ Action рд▓реЗрддрд╛ рд╣реИред

рд░реЗрдХреНрд╕ 0.12:

extension UIButton {
    public var rex_pressed: MutableProperty<CocoaAction> { get }

    // This one would become `BindingTarget`. Irrelevant to this issue.
    public var rex_title: MutableProperty<String> { get }
}

рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд (рд╕рднреА UIControl s рдкрд░ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ):

extension Reactive where Base: UIControl {
    /// The action is weakly referenced internally.
    public func setAction<Input, Output, Error>(
        _ action: Action<Input, Output, Error>,
        for controlEvents: UIControlEvents,
        inputTransform: (Self, UIControlEvents) -> Input
    )

    public func removeAction()

    /// ... some convenience overloads of `setAction(_:for:inputTransform:)`.
}

рд╕рд╛рдорд╛рдиреНрдпрддрдпрд╛, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ UI рд░рд╛рдЬреНрдпреЛрдВ рдХреЗ рддреАрди рд╡рд░реНрдЧ рд╣реИрдВ + рдПрдХ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ Action рд╕рд╛рде рдХрдорд╛рдВрдб рдкреИрдЯрд░реНрди рдХреЗ рд▓рд┐рдП:

  1. рдкрд░рд┐рд╡рд░реНрддрдирд╢реАрд▓ рдХреБрдВрдЬрд┐рдпрд╛рдБ рдЬрд┐рдирдХрд╛ рдХреЛрдИ рд╕рд╛рдзрди рдпрд╛ рдорд╛рди рдирд╣реАрдВ рд╣реИред
    рдЬреИрд╕реЗ UIControl.isEnabled , UILabel.text , UIView.isHidden ред

BindingTarget s рдХреЗ рд░реВрдк рдореЗрдВ рдореЙрдбрд▓ред

  1. рдирд┐рдпрдВрддреНрд░рдг рдШрдЯрдирд╛рдУрдВ, рдФрд░ рд╡рд┐рдзрд┐ рдХреЙрд▓ рдХреА рд╕реВрдЪрдирд╛рдПрдВред
    рдЬреИрд╕реЗ UIControl.trigger(for: .valueChanged) , UITableViewCell.trigger(for: #selector(prepareForReuse))

Signal s рдХреЗ рд░реВрдк рдореЗрдВ рдореЙрдбрд▓ред

  1. рдкрд░рд┐рд╡рд░реНрддрдиреАрдп рдХреБрдВрдЬрд┐рдпрд╛рдБ + рд╕рдВрдмрдВрдзрд┐рдд рдирд┐рдпрдВрддреНрд░рдг рдШрдЯрдирд╛ рдЬреЛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рдЗрдВрдЯрд░реИрдХреНрд╢рди рдкрд░ рдкреЛрд╕реНрдЯ рдХрд░рддреА рд╣реИред
    рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП UITextField.text , NSTextField.text , UISwitch.isOn

#3229

  1. [ _ Action рдХреЛ рдПрдХ рдирд┐рдпрдВрддреНрд░рдг рдХреЗ рд╕рд╛рде рдЬреЛрдбрд╝рдирд╛ред
    (рдпрд╣ рдХреЗрд╡рд▓ [1] рдФрд░ [2] рдХреЗ рд╢реАрд░реНрд╖ рдкрд░ рдирд┐рд░реНрдорд┐рдд рдПрдХ рд╕реБрд╡рд┐рдзрд╛ рдкреИрдЯрд░реНрди рд╣реИред)
    рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП UIButton.rac_command

_рдЗрд╕ рдореБрджреНрджреЗред _

@andersio рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ removeAction() рднреА рдХреНрдпрд╛ рдирд┐рдпрдВрддреНрд░рдг рдШрдЯрдирд╛рдУрдВ рдЖрдк рдХреЗ рд▓рд┐рдП рдХрд╛рд░реНрд░рд╡рд╛рдИ рдирд┐рдХрд╛рд▓ рд░рд╣реЗ рд╣реИрдВ 1.0 рдХреЗ рд▓рд┐рдП рд╕рд┐рд░реНрдл _or_ рдореИрдВ рдЗрд╕рдХрд╛ рдирд╛рдо рдмрджрд▓рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣реЛрдЧрд╛ removeAllActions() рдФрд░ рдХреЗ рд▓рд┐рдП рдПрдХ рдиреЛрдЯ рдЬреЛрдбрд╝рдиреЗ setAction() рдпрд╣ рдЗрдВрдЧрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдирд┐рдпрдВрддреНрд░рдг рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдЗрд╕ "рдЖрд╕рд╛рди рдПрдкреАрдЖрдИ" рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХреЗрд╡рд▓ рдПрдХ рд╣реА рдХреНрд░рд┐рдпрд╛ рдХреЛ рд╕рдВрднрд╛рд▓рддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд╡реИрд╕реЗ рднреА 99.9% рд▓реЛрдЧ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред

рдпрд╣ рд╡рд┐рдЪрд╛рд░рдгреАрдп рд╣реИред рдЖрдИрдПрдордУ рдХрдИ рдХрд╛рд░реНрд░рд╡рд╛рдЗрдпрд╛рдВ рд╕рдордЭ рдореЗрдВ рдирд╣реАрдВ рдЖрддреА рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдПрдХрд╛рдзрд┐рдХ рдХреНрд░рд┐рдпрд╛рдПрдВ isEnabled рд╕рдорд╡рд░реНрддреА (= рдереЛрдбрд╝реЗ рдЕрдирд┐рд╢реНрдЪрд┐рдд) рдореЗрдВ рд╣реЗрд░рдлреЗрд░ рдХрд░ рд╕рдХрддреА рд╣реИрдВред

рдХреНрдпреЛрдВ рди рдЬреЛрдбрд╝реЗрдВ (рд╕реНрд╡рд┐рдлреНрдЯ) рдЧреБрдг рдЬреЛ рд╕реАрдзреЗ рджреА рдЧрдИ рдХрд╛рд░реНрд░рд╡рд╛рдИ рдХреЛ рд╕реЗрдЯ рдХрд░рддреЗ рд╣реИрдВ?

extension Reactive where Base: UIButton {
    var pressed: CocoaAction {
        get { тАж }
        set { тАж }
    } 
}

рдпрд╛ рд╢рд╛рдпрдж рд╡рд╣ рдЖрдкрдХреЗ some convenience overloads рдЕрдиреБрднрд╛рдЧ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рдерд╛?

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЕрдЧрд░ рд╣рдо рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдПрдкреАрдЖрдИ рдЬреЛрдбрд╝рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рддреЛ рдпрд╣ рдареАрдХ рд╣реИ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╕реБрд╡рд┐рдзрд╛ рдПрдкреАрдЖрдИ рдЕрдзрд┐рдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИрдВред рдпрд╣реА рд╡рд╣ рдПрдкреАрдЖрдИ рд╣реИ рдЬрд┐рд╕реЗ рдореИрдВ рджреБрдирд┐рдпрд╛ рдХреЛ рджрд┐рдЦрд╛рдКрдВрдЧрд╛ред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдРрд╕рд╛ рдХреБрдЫ рдмрд╣реБрдд рд╣реА рдЖрдХрд░реНрд╖рдХ рд╣реИ:

button.reactive.pressed = CocoaAction(viewModel.action)

рдЬрдм рддрдХ рд╣рдо setAction(тАж) рд╕рд╛рде рдЬрд╛ рд░рд╣реЗ рд╣реИрдВ, рд╕рдВрднрд╡рддрдГ nil рдХрд╛рд░реНрд░рд╡рд╛рдИ рд╕реЗрдЯ рдХрд░рдХреЗ рд╣рдЯрд╛рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдПрдХ рдЕрд▓рдЧ рдПрдкреАрдЖрдИ рдХреА рдЬрд░реВрд░рдд рдирд╣реАрдВ рд╣реИред

рдпрд╣ рдирд┐рд╕реНрд╕рдВрджреЗрд╣ рдмреЗрд╣рддрд░ рджрд┐рдЦрддрд╛ рд╣реИ, рд╣рд╛рдБред рдЗрдиреНрд╣реЗрдВ рдЬрд░реВрд░ рд░рдЦрдирд╛ рдЪрд╛рд╣рд┐рдПред рдореИрдВ рдЕрднреА рднреА CocoaAction рдХреЛ Action рд▓рд┐рдП рдХрдордЬреЛрд░ рд╕рдВрджрд░реНрдн рдмрдирд╛рдиреЗ рдХрд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рдХрд░рддрд╛ рд╣реВрдВред

setAction рдЕрдкрдбреЗрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ ( 790b3e8 ), рдФрд░ pressed рд╡рд╛рдкрд╕ рдЖ рдЧрдпрд╛ рд╣реИ ( 790b3e8 )ред

extension Reactive where Base: UIButton {
    public var pressed: CocoaAction<Base> { get nonmutating set }
}

extension Reactive where Base: UIControl {
    public var action: CocoaAction<Base>? { get }
    public var controlEventsForAction: UIControlEvents? { get }

    /// `CocoaAction` is retained by `self`, but `CocoaAction` weakly references `Action`.
    public func setAction(
        _ action: CocoaAction<Base>?,
        for controlEvents: UIControlEvents
    )
}

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдПрдкреАрдЖрдИ рдХреЛ рдХрдИ рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред рддреЛ рдпрд╣ рдорд╛рдиреНрдп рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП:

button.reactive.setAction(action1, for: .touchUpInside)
button.reactive.setAction(action2, for: .touchUpOutside)
// button now has 2 actions set for 2 different events

CocoaAction рдХрдордЬреЛрд░ рд░реВрдк рд╕реЗ Action рд╕рдВрджрд░реНрдн рдХреНрдпреЛрдВ рджреЗрддрд╛ рд╣реИ?

@mdiep

// button now has 2 actions set for 2 different events

рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рд╣реЛрдЧрд╛ рдХрд┐ button рдХреА рд╕рдХреНрд╖рдо рд╕реНрдерд┐рддрд┐ action1.isEnabled рдФрд░ action2.isEnabled рджреЛрдиреЛрдВ рдХреЗ рд▓рд┐рдП рдмрд╛рдзреНрдп рд╣реИред рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рд╣рдо рдпрд╣реА рдЪрд╛рд╣рддреЗ рд╣реИрдВред рд╕рдХреНрд╖рдо рд░рд╛рдЬреНрдп рдХреИрд╕реЗ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП? рдПрдХ AND рд╕рднреА Action s' рд╕рдХреНрд╖рдо рдХрд░рдиреЗ рд╡рд╛рд▓реА рд╕реНрдерд┐рддрд┐ рдХрд╛?

рдХреЛрдХреЛрдПрдХреНрд╢рди рдХрдордЬреЛрд░ рд░реВрдк рд╕реЗ рдХрд╛рд░реНрд░рд╡рд╛рдИ рдХрд╛ рд╕рдВрджрд░реНрдн рдХреНрдпреЛрдВ рджреЗрддрд╛ рд╣реИ?

рдЗрд╕реЗ рд╡рд╛рдкрд╕ рдХрд░ рджрд┐рдпрд╛ред рдореИрдВ рдорд╛рдирддрд╛ рд╣реВрдБ рдХрд┐ рдпрд╣ рдЕрднреА рдХреЗ рд▓рд┐рдП (рдФрд░ рд░реЗрдХреНрд╕ рдХреЗ рдЗрддрд┐рд╣рд╛рд╕ рдХреЗ рджреМрд░рд╛рди) рдкрд░реЗрд╢рд╛рдиреА рдХрд╛ рдХрд╛рд░рдг рдирд╣реАрдВ рдмрдирддрд╛ рд╣реИред

рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рд╣реЛрдЧрд╛ рдХрд┐ рдмрдЯрди рдХреА рд╕рдХреНрд╖рдо рд╕реНрдерд┐рддрд┐ рджреЛрдиреЛрдВ action1.isEnabled рдФрд░ action2.isEnabled рдХреЗ рд▓рд┐рдП рдмрд╛рдзреНрдп рд╣реИред рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рд╣рдо рдпрд╣реА рдЪрд╛рд╣рддреЗ рд╣реИрдВред рд╕рдХреНрд╖рдо рд░рд╛рдЬреНрдп рдХреИрд╕реЗ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП? рдПрдХ рдФрд░ рд╕рднреА рдХрд╛рд░реНрд░рд╡рд╛рдЗрдпреЛрдВ рдХреЛ рд╕рдХреНрд╖рдо рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рд░рд╛рдЬреНрдп?

рдФрд░ рдореБрдЭреЗ рд╕рд╣реА рдирд╣реАрдВ рд▓рдЧрддрд╛ред

рдпрд╣рд╛рдВ рд╣рдорд╛рд░реЗ рд╡рд┐рдХрд▓реНрдк рд╣реИрдВ:

  1. рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕рдХреНрд╖рдо рдХрд░рдирд╛ рдЫреЛрдбрд╝ рджреЗрдВ
  2. рдФрд░ рд╕рднреА рдХрд╛рд░реНрд░рд╡рд╛рдЗрдпрд╛рдВ 'рд╕рдХреНрд╖рдо рд╕реНрдерд┐рддрд┐
  3. рдпрд╛ рд╕рднреА рдХрд╛рд░реНрд░рд╡рд╛рдЗрдпреЛрдВ рдХреА рд╕рдХреНрд╖рдо рд╕реНрдерд┐рддрд┐
  4. рдЕрдЧрд░ рдареАрдХ 1 рдХреНрд░рд┐рдпрд╛ рд╣реИ рддреЛ рд╕рдХреНрд╖рдо рдХрд░реЗрдВ
  5. .pressed , рдЖрджрд┐ рдореЗрдВ рд╕рдХреНрд╖рдо рдХрд░реЗрдВ рдФрд░ рд╕реАрдзреЗ setAction(:for:)

(5) рдореЗрд░реЗ рд▓рд┐рдП рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рд╕рдорд╛рдзрд╛рди рд▓рдЧрддрд╛ рд╣реИред рд╕рд╛рдорд╛рдиреНрдп рдорд╛рдорд▓рд╛ рдЖрд╕рд╛рди рдФрд░ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИред рдпрджрд┐ рдЖрдк рдХреБрдЫ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддрдм рднреА рдЖрдк рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

(5) рдХрд╛ рдЕрд░реНрде рд╣реИ setAction рдХреЛ рдХрдИ actionN <~ reactive.trigger(for: .specificEvent) рдХрд░рдиреЗ рд╕реЗ рдХреЛрдИ рдлрд░реНрдХ рдирд╣реАрдВ рдкрдбрд╝реЗрдЧрд╛ред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдпрджрд┐ рдирд┐рдпрдВрддреНрд░рдг рдореЗрдВ рдПрдХрд╛рдзрд┐рдХ рд╕реБрд╡рд┐рдзрд╛ рдХрдорд╛рдВрдб рд╕реНрд▓реЙрдЯ рд╣реЛрдВ рддреЛ рдХреНрдпрд╛ рд╣реЛрдЧрд╛?

рдЗрд╕рдореЗрдВ рдЕрднреА рднреА рдЕрд▓рдЧ рд╣реИ:

  1. рд░рджреНрдж рдХрд░рдирд╛ рдЕрд▓рдЧ рд╣реИ
  2. рдпрд╣ рдкреНрд░рддрд┐ рдШрдЯрдирд╛ рдХреЗрд╡рд▓ рдПрдХ рдХреНрд░рд┐рдпрд╛ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ
  3. рдпрд╣ CocoaAction . рдХреЗ рдЗрдирдкреБрдЯ рдХреЗ рд░реВрдк рдореЗрдВ рдирд┐рдпрдВрддреНрд░рдг рдкрд╛рд╕ рдХрд░рддрд╛ рд╣реИ

рдЕрдиреНрдпрдерд╛ рд╡реЗ рдореЛрдЯреЗ рддреМрд░ рдкрд░ рд╡рд╣реА рд╣реИрдВ, рд╣рд╛рдБред рд▓реЗрдХрд┐рди рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдареАрдХ рд╣реИред

рдпрджрд┐ рдпреЛрдЬрдирд╛ рдПрдХ рд╕реЗ рдЕрдзрд┐рдХ рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдиреЗ рдХреА рд╣реИ, рддреЛ рд╣рдореЗрдВ рд╕рдВрднрд╡рддрдГ рдЗрд╕рдХрд╛ рдирд╛рдо рдмрджрд▓рдХрд░ addAction рдХрд░ рджреЗрдирд╛ рдЪрд╛рд╣рд┐рдПред

рдорд╛рди рд▓реАрдЬрд┐рдП рдХрд┐ рдЕрдЧрд░ рд╣рдо propagateEnablingState рддрд░реНрдХ рдХреЛ setAction рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ, рддреЛ рд╣рдореЗрдВ рдЕрднреА рднреА рдпрд╣ рддрдп рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдХрд┐ isEnabled рдХреЗ рд╡реЗрдХреНрдЯрд░ рдХреЛ рдХреИрд╕реЗ рд╕рдВрднрд╛рд▓рдирд╛ рд╣реИред (рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдиреЗ рдпреЛрдЧреНрдп? рдЬреИрд╕реЗ рдФрд░/рдпрд╛/рдЕрдкрд░рд┐рднрд╛рд╖рд┐рдд?)

рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдпрд╣ "рд╕реБрд╡рд┐рдзрд╛ рд╕рдВрдкрддреНрддрд┐" рдореЗрдВ 1 рдХрд╛рд░реНрд░рд╡рд╛рдИ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдиреЗ рд▓рд╛рдпрдХ рд╣реИ, рдЬрд┐рд╕ рдкрд░ рдпрд╣рд╛рдВ рдЪрд░реНрдЪрд╛ рдХреА рдЬрд╛ рд░рд╣реА рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд╣рдордиреЗ рдЙрди рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рд╡реИрдХрд▓реНрдкрд┐рдХ рдЙрдкрдпреЛрдЧ (рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ trigger(for:) рд╕рд╛рде рдХрд╛рд░реНрд░рд╡рд╛рдЗрдпрд╛рдВ рдЯреНрд░рд┐рдЧрд░ рдХрд░рдирд╛) рдЫреЛрдбрд╝ рджрд┐рдпрд╛ рд╣реИ рдЬрд┐рдиреНрд╣реЗрдВ рдПрдХ рд╕реЗ рдЕрдзрд┐рдХ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

рдЙрдкрдпреЛрдЧ рдореЗрдВ рдЖрд╕рд╛рди рд╡рд┐рдХрд▓реНрдк (рдпрд╣ рд╣рдорд╛рд░реЗ рдЕрдиреНрдп рд╕рд┐рдЧреНрдирд▓/рдмрд╛рдЗрдВрдбрд┐рдВрдЧ рд▓рдХреНрд╖реНрдп рд╕рд╛рдордЧреНрд░реА рдХреЗ рдЙрдкрдпреЛрдЧ рд╕реЗ рдореЗрд▓ рдЦрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рднреА рд╣реЛрддрд╛ рд╣реИ) рдХреЛ рджреЗрдЦрддреЗ рд╣реБрдП рдореБрдЭреЗ рдЗрд╕ рддрд░рд╣ рд╕реЗ рдПрдХ рдмрдЯрди рдореЗрдВ рдПрдХ рд╕реЗ рдЕрдзрд┐рдХ рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХрд╛ рдПрдХ рдЕрдЪреНрдЫрд╛ рдХрд╛рд░рдг рдирд╣реАрдВ рджрд┐рдЦ рд░рд╣рд╛ рд╣реИред

рдореВрд▓ рд░реВрдк рд╕реЗ, рдпрджрд┐ рдЖрдк рдПрдХ "рд╕рд░рд▓ рдПрдкреАрдЖрдИ" рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рдпрд╣рд╛рдВ рдХреА рддрд░рд╣ action рд╕рдВрдкрддреНрддрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред рдЗрд╕рдХреА рд╕рдХреНрд╖рдо рд╕реНрдерд┐рддрд┐ рдмрдЯрди рдореЗрдВ рджрд┐рдЦрд╛рдИ рджреЗрддреА рд╣реИред

рдпрджрд┐ рдЖрдк >1 рдХреНрд░рд┐рдпрд╛ рдХреЗ рд▓рд┐рдП рдПрдХ рдмрдЯрди рд╕рдВрд▓рдЧреНрди рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рдЙрдирдХреЗ рд╡реНрдпрдХреНрддрд┐рдЧрдд trigger s рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдлрд┐рд░ map рдХреЛ isEnabled BindingTarget рдореЗрдВ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ map рдХреЛ рд╣реБрдХ рдЕрдк рдХрд░рддреЗ рд╣реИрдВред BindingTarget ред рдХреНрдпрд╛ рдпрд╣ рдЙрдЪрд┐рдд рд▓рдЧрддрд╛ рд╣реИ?

рдореВрд▓ рд░реВрдк рд╕реЗ, рдпрджрд┐ рдЖрдк "рд╕рд░рд▓ рдПрдкреАрдЖрдИ" рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рдпрд╣рд╛рдВ рдХреА рддрд░рд╣ рдПрдХреНрд╢рди рдкреНрд░реЙрдкрд░реНрдЯреА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред рдЗрд╕рдХреА рд╕рдХреНрд╖рдо рд╕реНрдерд┐рддрд┐ рдмрдЯрди рдореЗрдВ рджрд┐рдЦрд╛рдИ рджреЗрддреА рд╣реИред

рдпрджрд┐ рдЖрдк >1 рдХреНрд░рд┐рдпрд╛ рдХреЗ рд▓рд┐рдП рдПрдХ рдмрдЯрди рд╕рдВрд▓рдЧреНрди рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рдЙрдирдХреЗ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдЯреНрд░рд┐рдЧрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдлрд┐рд░ isEnabled BindingTarget рдореЗрдВ рд╣реБрдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдорд╛рдирдЪрд┐рддреНрд░ рдХреЛ рд╣реБрдХ рдЕрдк рдХрд░рддреЗ рд╣реИрдВред рдХреНрдпрд╛ рдпрд╣ рдЙрдЪрд┐рдд рд▓рдЧрддрд╛ рд╣реИ?

рдпрд╣ рдореБрдЭреЗ рдЙрдЪрд┐рдд рд▓рдЧрддрд╛ рд╣реИред

рддреЛ рдХреНрдпрд╛ рд╣рдореЗрдВ setAction(:for:) ?

рдлрд┐рд░ рдЫреБрдкрд╛ рд▓реЗрдВрдЧреЗред рдЗрд╕реЗ рд╕рд░рд▓ рд░рдЦреЗрдВред

рдХреНрдпрд╛ рдпрд╣ рдкреГрд╖реНрда рдЙрдкрдпреЛрдЧреА рдерд╛?
0 / 5 - 0 рд░реЗрдЯрд┐рдВрдЧреНрд╕

рд╕рдВрдмрдВрдзрд┐рдд рдореБрджреНрджреЛрдВ

danishin picture danishin  ┬╖  4рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

gabro picture gabro  ┬╖  5рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

iby picture iby  ┬╖  5рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

BrettThePark picture BrettThePark  ┬╖  4рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

Lewion picture Lewion  ┬╖  4рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ