LoginSignup
19
10

More than 3 years have passed since last update.

IBActionの引数にあるsenderの使いみち(Swift)

Last updated at Posted at 2020-06-17

はじめに

sender については以下の記事にいろいろ書いているので、読んでから本記事を読んでいただけるとわかりやすいと思います。
https://qiita.com/uhooi/items/e90d06e5d5681d72cbd0

そもそも IBActionsender を使う機会はあまりないと思います。
少なくとも私はほとんど使わず、使いみちがパッとは出てきませんでした。

Twitterで教えていただいたので紹介します。

sender の使いみち

さっそく IBAction の引数である sender の使いみちを紹介します。

1つの IBAction に複数のUIを紐付けて区別する

例えば電卓アプリで、1〜9のボタンを1つの IBAction に紐付け、 sender でどのボタンがタップされたか判断します。
IBAction を1つのみ定義すれば済むので、コードがスッキリします。
(わかりやすいように titleLabel?.text で判断していますが、その是非はここでは考えません)

FooViewController.swift
final class FooViewController: UIViewController {
    @IBAction private func didTapNumberButton(_ sender: UIButton) {
        switch sender.titleLabel?.text {
        case "1":
            // 「1」をタップしたときの処理
        case "2":
            // 「2」をタップしたときの処理
        // ...
        }
    }
}

これは好みかもしれませんが、私はUIと IBAction が1:1で紐付いているほうが可読性が高いと感じるので、あまり使いません。

私は1つのIBActionに1つのUIのみ紐付ける
final class FooViewController: UIViewController {
    @IBAction private func didTapOneButton(_ sender: UIButton) {
        // 「1」をタップしたときの処理
    }

    @IBAction private func didTapTwoButton(_ sender: UIButton) {
        // 「2」をタップしたときの処理
    }

    // ...
}

コード量は増えますが、より具体的なボタン名をメソッド名に付けられるので、わかりやすいと感じます。

また、電卓の didTapNumberButton(_:) のように、どのUIが紐付いているか推測しやすければいいのですが、UIによってはどれが IBAction に紐付いているかコードから推測しにくくなります。
1:1と決めておけばコードからかんたんに推測できます。

ポップオーバーの表示元のビューに指定する

iPadではポップオーバーを吹き出しで表示するため、吹き出しの表示元(三角がどこから表示されるか)を指定する必要があります。
そのときに sender を使うとかんたんに指定できます。

「共有」ボタンのタップ時にアクティビティを表示する
final class FooViewController: UIViewController {
    @IBAction private func didTapShareButton(_ sender: UIBarButtonItem) {
        let activityItems: [Any?] = ["Foo", nil, nil]
        let activityVC = UIActivityViewController(activityItems: activityItems as [Any], applicationActivities: nil)
        activityVC.popoverPresentationController?.barButtonItem = sender
        present(activityVC, animated: true)
    }
}

表示元(ここでは UIBarButtonItem )を IBOutlet で繋げても実現できますが、アウトレット接続するとプロパティを自由に変更できるなどスコープが広がるため、 sender を使って処理するのが望ましいです。

macOSでは大活躍

macOSだと sender が大活躍するとのことです。
私はmacOSのアプリを開発したことがないため、Kyomeさんのツイートとコメントの紹介に留めます。

19
10
9

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
19
10