Skip to content

Instantly share code, notes, and snippets.

@eliyap
Created March 24, 2022 16:33
Show Gist options
  • Save eliyap/c8e44606930eaf03f8fd944adc0c31d4 to your computer and use it in GitHub Desktop.
Save eliyap/c8e44606930eaf03f8fd944adc0c31d4 to your computer and use it in GitHub Desktop.
import UIKit
protocol MessageDelegate: AnyObject {
func didPressButton() -> Void
}
/// Represents a view that will send messages, e.g. button presses.
final class SenderView<MyMessageDelegate: MessageDelegate>: UIView {
private let myButton: UIButton
public weak var messageDelegate: MyMessageDelegate? = nil
@MainActor
init() {
self.myButton = .init()
super.init(frame: .zero)
let action = UIAction { [weak self] (action) in
/// TODO: Send message to `ReceiverView`...
self?.messageDelegate?.didPressButton()
}
myButton.addAction(action, for: .touchUpInside)
}
required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
}
/// Represents a view that responds to events.
final class ReceiverView: UIView {
@MainActor
init() {
super.init(frame: .zero)
}
func didReceiveMessage() {
print("Got a message from SenderView!")
}
required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
}
extension ReceiverView: MessageDelegate {
func didPressButton() {
self.didReceiveMessage()
}
}
/// Represents some controller coordinating senders and receivers.
final class MyViewController : UIViewController {
let senderView: SenderView<ReceiverView>
let receiverView: ReceiverView
@MainActor
init() {
senderView = .init()
receiverView = .init()
super.init(nibName: nil, bundle: nil)
view.addSubview(senderView)
view.addSubview(receiverView)
/// Layout stuff here...
/// TODO: connect sender to receiver...
senderView.messageDelegate = receiverView
}
required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment