Slide 1

Slide 1 text

Delegate Chaining Workaround October 2010 Kaz Yoshikawa

Slide 2

Slide 2 text

About me

Slide 3

Slide 3 text

Kaz Yoshikawa • Electricwoods LLC ୅ද / Digital Lynx Systems Inc. ෭୅ද • e-mail: [email protected] • twitter: @codelynx1 • Working History • Adobe Systems (Tokyo) • Lionbridge (Tokyo) • Quark (Tokyo / Denver) • Hummingbird Communications (Mt. View, USA) • Fact International (Vancouver, Canada) • Perle Systems (Toronto, Canada), etc.

Slide 4

Slide 4 text

What is Delegate Chaining?

Slide 5

Slide 5 text

Delegate Chaining Primary VC Secondary VC Primary VC Secondary VC Tertiary VC Quaternary VC Delegate Delegate Delegate Delegate • Simple delegate: • Chain of delegates: Method Invocation

Slide 6

Slide 6 text

protocol SecondaryViewControllerDelegate: AnyObject { func save() } class PrimaryViewController: UIViewController, SecondaryViewControllerDelegate { func save() { // save } } class SecondaryViewController: UIViewController { weak var delegate: SecondaryViewControllerDelegate? @IBAction func save(_ sender: UIButton) { self.delegate?.save() } } Simple Delegate

Slide 7

Slide 7 text

Delegate Chaining class PrimaryViewController: UIViewController, SecondaryViewControllerDelegate { func save() { // save } } class SecondaryViewController: UIViewController, TertiaryViewControllerDelegate { weak var delegate: SecondaryViewControllerDelegate? func save() { self.delegate?.save() } } class TertiaryViewController: UIViewController, QuaternaryViewControllerDelegate { weak var delegate: TertiaryViewController? func save() { self.delegate?.save() } } class QuaternaryViewController: UIViewController { weak var delegate: QuaternaryViewControllerDelegate? @IBAction func save(_ sender: UIButton) { self.delegate?.save() } }

Slide 8

Slide 8 text

Using UIResponder chain extension UIResponder { func findResponder() -> T? { var responder = self.next while responder != nil { if let candidate = responder as? T { return candidate } responder = responder!.next } return nil } }

Slide 9

Slide 9 text

protocol SaveProtocol: AnyObject { func save() } class PrimaryViewController : UIViewController, SaveProtocol { // snip func save() { print("Saved !!") } } // snip class QuaternaryViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad() self.save() } func save() { if let saver = self.findResponder() as SaveProtocol? { saver.save() } } } Provide a Protocol

Slide 10

Slide 10 text

Don’t extension UIResponder { func findResponder() -> T? { var responder = self.next while responder != nil { if let candidate = responder as? T { return candidate } responder = responder!.next } return nil } }

Slide 11

Slide 11 text

Sample Code •https://gist.github.com/codelynx/ 11f1fc1dc8a0de679c05dc88016a2480

Slide 12

Slide 12 text

Wrap Up • You may avoid making delegate chain by following its responder chain • Don’t abuse

Slide 13

Slide 13 text

fin