LoginSignup
0
1

More than 3 years have passed since last update.

CustomView上のButtonから別クラスにアクションを設定する方法

Last updated at Posted at 2020-11-23

swift

CustomViewを作成し、別のViewContoroller上に表示させたは良いものの、CustomView 上に設置したButtonのアクションをどうやってそのVCで発動させるかでつまずいたので、その方法をざっくり解説します。

結論、protocoldelegateを使用します。

流れ

  • 前提確認
  • protocol宣言
  • 処理を発動するクラスでの記述
  • 処理を行うクラスでの記述
  • それぞれのコードと画面
  • 終わりに

前提確認

MacOS Catalina 10.15.4
Xcode 12.1
Swift version 5

CustomView(これに接続するVCをCustomViewVCと命名)で上下矢印のUIButtonを用意し、別のVC(MainVCと命名)上にあるUILabelの値を変化させます。変化のさせ方は「上矢印を押せば+1、下矢印を押せば-1」(以下、処理)とします。
protocoldelegateを使用しますが、CustomViewVCが処理を発動させるクラス、MainVCが処理を実際に行うクラスになります。
尚、CustomViewVCの作成は主旨から外れますので他の記事に譲ります。

protocol宣言

宣言場所はどのクラスでも大丈夫ですが、import xxxclass xxxの間に書くようにしましょう。
ここではMainVCに書くことにします。

MainVC
import UIKit

@objc protocol CustomViewDelegate : NSObjectProtocol {

    func plus()

    func minus()

}

class MainViewController: UIViewController{

処理を発動するクラスでの記述

protocol型の変数を宣言します。変数名はdelegateTestとします。
ここでIBOutletで接続させるのがミソです。

CustomViewVC
@IBOutlet var delegateTest: CustomViewDelegate?

上下矢印ButtonをそれぞれIBAction接続し、その中に+1と-1の処理を発動させます。
(発動だけで、ここで処理は行われません)

CustomViewVC
@IBAction func plus() {
        delegateTest?.plus()
    }

    @IBAction func minus() {
        delegateTest?.minus()
    }

処理を行うクラスでの記述

まずは、protocolを継承させます。

MainVC
class MainViewController: UIViewController, CustomViewDelegate {

次に、MainVCCustomViewからdelegateを接続させます。
これを行うことでCustomViewで発動させた処理を、MainVCにて行うことができます。
その接続方法ですが、CustomViewを表示させているUIViewをクリックし、インスペクタバー の「Show the Connections inspector」(一番右のアイコン)を見ます。
すると、先ほどIBOutletで宣言したdelegate変数が表示されているので、MainVCにドラックして接続させます。

あとは行う処理を内容を記述すればOKです。

MainVC
    func plus() {
        number += 1
        label.text = "\(number)"
    }

    func minus() {
        number -= 1
        label.text = "\(number)"
    }

それぞれコードと画面

CustomViewVC
import UIKit

class CustomView: UIView {

    @IBOutlet var plusBtn: UIButton!
    @IBOutlet var minusBtn: UIButton!


    @IBOutlet var delegateTest: CustomViewDelegate?

    override init(frame: CGRect) {
        super.init(frame: frame)
        loadNib()
    }

    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
        loadNib()
        //fatalErrorがデフォルトで入っていますが消さないとエラーになってしまうので注意してください!
    }

    func loadNib() {
        //CustomViewの部分は各自作成したXibの名前に書き換えてください
        let view = Bundle.main.loadNibNamed("CustomView", owner: self, options: nil)?.first as! UIView
        view.frame = self.bounds
        self.addSubview(view)
    }

    @IBAction func plus() {
        delegateTest?.plus()
    }

    @IBAction func minus() {
        delegateTest?.minus()
    }

WechatIMG851.png

MainViewController
import UIKit

@objc protocol CustomViewDelegate : NSObjectProtocol {

    func plus()

    func minus()

}

class MainViewController: UIViewController, CustomViewDelegate {


    @IBOutlet weak var testView: CustomView!
    @IBOutlet weak var label: UILabel!

    var number = 0

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view.
        }

    func plus() {
        number += 1
        label.text = "\(number)"
    }

    func minus() {
        number -= 1
        label.text = "\(number)"
    }


}

WechatIMG852.png

終わりに

CustomViewは便利だと思うのですが、私自身今まで使ったことがなく、表示させたは良いものの、使い勝手悪いように感じましたので、ここで使い方の一つを解説させて頂きました。
protocolの中身がほぼないのは良くないかもしれませんが、あくまでCustomViewの処理を別VCで行うことを主旨とするため、簡潔にさせて頂きました。
初めての投稿ですので、至らない点あるかと思いますが、何かあればご指摘・アドバイス頂けると幸いです。

0
1
0

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
0
1