рджреЛ рдПрдкреАрдЖрдИ рд╣реИрдВ рдЬреЛ рдХрдорд╛рдВрдб рдкреИрдЯрд░реНрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред рдЬреИрд╕рд╛ рдХрд┐ @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)
рд▓реЗрдХрд┐рди рд╣рдорд╛рд░реЗ рдХрдордЬреЛрд░-рд╕реЗ-рдХрдордЬреЛрд░ рдмрд╛рдзреНрдпрдХрд╛рд░реА рд╢рдмреНрджрд╛рд░реНрде рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдПрдХ рдЕрд▓рдЧ рд╕реНрд╡рд╛рдорд┐рддреНрд╡ рдХреЗ рд╕рд╛рдеред
рдпрд╣ рди рднреВрд▓реЗрдВ рдХрд┐ рд╣рдореЗрдВ рд╕рдорд╛рди рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреЗ рд▓рд┐рдП рднреА рдЗрд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА:
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
рд╕рд╛рде рдХрдорд╛рдВрдб рдкреИрдЯрд░реНрди рдХреЗ рд▓рд┐рдП:
UIControl.isEnabled
, UILabel.text
, UIView.isHidden
редBindingTarget
s рдХреЗ рд░реВрдк рдореЗрдВ рдореЙрдбрд▓ред
UIControl.trigger(for: .valueChanged)
, UITableViewCell.trigger(for: #selector(prepareForReuse))
Signal
s рдХреЗ рд░реВрдк рдореЗрдВ рдореЙрдбрд▓ред
UITextField.text
, NSTextField.text
, UISwitch.isOn
#3229
Action
рдХреЛ рдПрдХ рдирд┐рдпрдВрддреНрд░рдг рдХреЗ рд╕рд╛рде рдЬреЛрдбрд╝рдирд╛ред 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 рдХреЗ рд▓рд┐рдП рдмрд╛рдзреНрдп рд╣реИред рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рд╣рдо рдпрд╣реА рдЪрд╛рд╣рддреЗ рд╣реИрдВред рд╕рдХреНрд╖рдо рд░рд╛рдЬреНрдп рдХреИрд╕реЗ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП? рдПрдХ рдФрд░ рд╕рднреА рдХрд╛рд░реНрд░рд╡рд╛рдЗрдпреЛрдВ рдХреЛ рд╕рдХреНрд╖рдо рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рд░рд╛рдЬреНрдп?
рдФрд░ рдореБрдЭреЗ рд╕рд╣реА рдирд╣реАрдВ рд▓рдЧрддрд╛ред
рдпрд╣рд╛рдВ рд╣рдорд╛рд░реЗ рд╡рд┐рдХрд▓реНрдк рд╣реИрдВ:
.pressed
, рдЖрджрд┐ рдореЗрдВ рд╕рдХреНрд╖рдо рдХрд░реЗрдВ рдФрд░ рд╕реАрдзреЗ setAction(:for:)
(5) рдореЗрд░реЗ рд▓рд┐рдП рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рд╕рдорд╛рдзрд╛рди рд▓рдЧрддрд╛ рд╣реИред рд╕рд╛рдорд╛рдиреНрдп рдорд╛рдорд▓рд╛ рдЖрд╕рд╛рди рдФрд░ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИред рдпрджрд┐ рдЖрдк рдХреБрдЫ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддрдм рднреА рдЖрдк рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
(5) рдХрд╛ рдЕрд░реНрде рд╣реИ setAction
рдХреЛ рдХрдИ actionN <~ reactive.trigger(for: .specificEvent)
рдХрд░рдиреЗ рд╕реЗ рдХреЛрдИ рдлрд░реНрдХ рдирд╣реАрдВ рдкрдбрд╝реЗрдЧрд╛ред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдпрджрд┐ рдирд┐рдпрдВрддреНрд░рдг рдореЗрдВ рдПрдХрд╛рдзрд┐рдХ рд╕реБрд╡рд┐рдзрд╛ рдХрдорд╛рдВрдб рд╕реНрд▓реЙрдЯ рд╣реЛрдВ рддреЛ рдХреНрдпрд╛ рд╣реЛрдЧрд╛?
рдЗрд╕рдореЗрдВ рдЕрднреА рднреА рдЕрд▓рдЧ рд╣реИ:
CocoaAction
. рдХреЗ рдЗрдирдкреБрдЯ рдХреЗ рд░реВрдк рдореЗрдВ рдирд┐рдпрдВрддреНрд░рдг рдкрд╛рд╕ рдХрд░рддрд╛ рд╣реИрдЕрдиреНрдпрдерд╛ рд╡реЗ рдореЛрдЯреЗ рддреМрд░ рдкрд░ рд╡рд╣реА рд╣реИрдВ, рд╣рд╛рдБред рд▓реЗрдХрд┐рди рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдареАрдХ рд╣реИред
рдпрджрд┐ рдпреЛрдЬрдирд╛ рдПрдХ рд╕реЗ рдЕрдзрд┐рдХ рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдиреЗ рдХреА рд╣реИ, рддреЛ рд╣рдореЗрдВ рд╕рдВрднрд╡рддрдГ рдЗрд╕рдХрд╛ рдирд╛рдо рдмрджрд▓рдХрд░ addAction
рдХрд░ рджреЗрдирд╛ рдЪрд╛рд╣рд┐рдПред
рдорд╛рди рд▓реАрдЬрд┐рдП рдХрд┐ рдЕрдЧрд░ рд╣рдо propagateEnablingState
рддрд░реНрдХ рдХреЛ setAction
рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ, рддреЛ рд╣рдореЗрдВ рдЕрднреА рднреА рдпрд╣ рддрдп рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдХрд┐ isEnabled
рдХреЗ рд╡реЗрдХреНрдЯрд░ рдХреЛ рдХреИрд╕реЗ рд╕рдВрднрд╛рд▓рдирд╛ рд╣реИред (рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдиреЗ рдпреЛрдЧреНрдп? рдЬреИрд╕реЗ рдФрд░/рдпрд╛/рдЕрдкрд░рд┐рднрд╛рд╖рд┐рдд?)
рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдпрд╣ "рд╕реБрд╡рд┐рдзрд╛ рд╕рдВрдкрддреНрддрд┐" рдореЗрдВ 1 рдХрд╛рд░реНрд░рд╡рд╛рдИ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдиреЗ рд▓рд╛рдпрдХ рд╣реИ, рдЬрд┐рд╕ рдкрд░ рдпрд╣рд╛рдВ рдЪрд░реНрдЪрд╛ рдХреА рдЬрд╛ рд░рд╣реА рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд╣рдордиреЗ рдЙрди рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рд╡реИрдХрд▓реНрдкрд┐рдХ рдЙрдкрдпреЛрдЧ (рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ trigger(for:)
рд╕рд╛рде рдХрд╛рд░реНрд░рд╡рд╛рдЗрдпрд╛рдВ рдЯреНрд░рд┐рдЧрд░ рдХрд░рдирд╛) рдЫреЛрдбрд╝ рджрд┐рдпрд╛ рд╣реИ рдЬрд┐рдиреНрд╣реЗрдВ рдПрдХ рд╕реЗ рдЕрдзрд┐рдХ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред
рдЙрдкрдпреЛрдЧ рдореЗрдВ рдЖрд╕рд╛рди рд╡рд┐рдХрд▓реНрдк (рдпрд╣ рд╣рдорд╛рд░реЗ рдЕрдиреНрдп рд╕рд┐рдЧреНрдирд▓/рдмрд╛рдЗрдВрдбрд┐рдВрдЧ рд▓рдХреНрд╖реНрдп рд╕рд╛рдордЧреНрд░реА рдХреЗ рдЙрдкрдпреЛрдЧ рд╕реЗ рдореЗрд▓ рдЦрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рднреА рд╣реЛрддрд╛ рд╣реИ) рдХреЛ рджреЗрдЦрддреЗ рд╣реБрдП рдореБрдЭреЗ рдЗрд╕ рддрд░рд╣ рд╕реЗ рдПрдХ рдмрдЯрди рдореЗрдВ рдПрдХ рд╕реЗ рдЕрдзрд┐рдХ рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХрд╛ рдПрдХ рдЕрдЪреНрдЫрд╛ рдХрд╛рд░рдг рдирд╣реАрдВ рджрд┐рдЦ рд░рд╣рд╛ рд╣реИред
рдореВрд▓ рд░реВрдк рд╕реЗ, рдпрджрд┐ рдЖрдк рдПрдХ "рд╕рд░рд▓ рдПрдкреАрдЖрдИ" рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рдпрд╣рд╛рдВ рдХреА рддрд░рд╣ action
рд╕рдВрдкрддреНрддрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред рдЗрд╕рдХреА рд╕рдХреНрд╖рдо рд╕реНрдерд┐рддрд┐ рдмрдЯрди рдореЗрдВ рджрд┐рдЦрд╛рдИ рджреЗрддреА рд╣реИред
рдпрджрд┐ рдЖрдк >1 рдХреНрд░рд┐рдпрд╛ рдХреЗ рд▓рд┐рдП рдПрдХ рдмрдЯрди рд╕рдВрд▓рдЧреНрди рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рдЙрдирдХреЗ рд╡реНрдпрдХреНрддрд┐рдЧрдд trigger
s рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдлрд┐рд░ map
рдХреЛ isEnabled
BindingTarget
рдореЗрдВ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ map
рдХреЛ рд╣реБрдХ рдЕрдк рдХрд░рддреЗ рд╣реИрдВред BindingTarget
ред рдХреНрдпрд╛ рдпрд╣ рдЙрдЪрд┐рдд рд▓рдЧрддрд╛ рд╣реИ?
рдореВрд▓ рд░реВрдк рд╕реЗ, рдпрджрд┐ рдЖрдк "рд╕рд░рд▓ рдПрдкреАрдЖрдИ" рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рдпрд╣рд╛рдВ рдХреА рддрд░рд╣ рдПрдХреНрд╢рди рдкреНрд░реЙрдкрд░реНрдЯреА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред рдЗрд╕рдХреА рд╕рдХреНрд╖рдо рд╕реНрдерд┐рддрд┐ рдмрдЯрди рдореЗрдВ рджрд┐рдЦрд╛рдИ рджреЗрддреА рд╣реИред
рдпрджрд┐ рдЖрдк >1 рдХреНрд░рд┐рдпрд╛ рдХреЗ рд▓рд┐рдП рдПрдХ рдмрдЯрди рд╕рдВрд▓рдЧреНрди рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рдЙрдирдХреЗ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдЯреНрд░рд┐рдЧрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдлрд┐рд░ isEnabled BindingTarget рдореЗрдВ рд╣реБрдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдорд╛рдирдЪрд┐рддреНрд░ рдХреЛ рд╣реБрдХ рдЕрдк рдХрд░рддреЗ рд╣реИрдВред рдХреНрдпрд╛ рдпрд╣ рдЙрдЪрд┐рдд рд▓рдЧрддрд╛ рд╣реИ?
рдпрд╣ рдореБрдЭреЗ рдЙрдЪрд┐рдд рд▓рдЧрддрд╛ рд╣реИред
рддреЛ рдХреНрдпрд╛ рд╣рдореЗрдВ setAction(:for:)
?
рдлрд┐рд░ рдЫреБрдкрд╛ рд▓реЗрдВрдЧреЗред рдЗрд╕реЗ рд╕рд░рд▓ рд░рдЦреЗрдВред
рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА
рдлрд┐рд░ рдЫреБрдкрд╛ рд▓реЗрдВрдЧреЗред рдЗрд╕реЗ рд╕рд░рд▓ рд░рдЦреЗрдВред