์ƒ์„ธ ์ปจํ…์ธ 

๋ณธ๋ฌธ ์ œ๋ชฉ

[ UIKit ] addTarget(_:action:for:) ๋ฉ”์„œ๋“œ

๐ŸŽ iOS/UIKit

by AHN.Jihyeon 2024. 6. 30. 20:00

๋ณธ๋ฌธ

์ด๋ฒˆ ์ฝ”๋“œ๋ฒ ์ด์Šค๋กœ ๊ตฌํ˜„ํ•  ๋•Œ ๊ฐ€์žฅ ์–ด๋ ค์› ๋˜ ๋ถ€๋ถ„์ด

๊ฐ ์ฝ”๋“œ๋“ค๊ฐ„์˜ ์—ฐ๊ฒฐ๊ณ ๋ฆฌ๋ฅผ ์ด์–ด๋‚˜๊ฐ€๋Š” ๊ฒƒ์ด ์–ด๋ ค์› ๋‹ค. 

๊ทธ๋ž˜์„œ ํ•˜๋‚˜ํ•˜๋‚˜ ๋œฏ์–ด๋ณด๋ฉด์„œ ๊ณต๋ถ€ํ•˜๋‹ค ๋ณด๋‹ˆ ์˜๋ฌธ์ด ๋“œ๋Š” ๋ฉ”์„œ๋“œ๋‹ค. 

 

์ด๋ฒคํŠธ ๋ฐœ์ƒ ์‹œ ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•  ๋•Œ ๋งŽ์ด ์‚ฌ์šฉํ•˜๊ณค ํ•˜๋Š”๋ฐ

target์— ์ฃผ๋กœ self๊ฐ€ ์‚ฌ์šฉ๋˜์–ด ์˜๋ก€์ ์œผ๋กœ ์‚ฌ์šฉํ•˜๊ณค ํ–ˆ์—ˆ๋‹ค. 

 

ํ•˜์ง€๋งŒ ์ •ํ™•ํ•˜๊ฒŒ ๋ฌด์—‡์„ ์˜๋งˆํ•˜๊ณ ,

์–ด๋–ป๊ฒŒ ์ด ์ฝ”๋“œ๋กœ ์ธํ•ด ํ•ด๋‹น ๋ฉ”์„œ๋“œ๊ฐ€ ์‹คํ–‰๋˜๋Š”์ง€์— ๋Œ€ํ•œ

์˜๋ฌธ์ด ์ƒ๊ฒจ ํ•ด๋‹น ๋‚ด์šฉ์„ ์ •๋ฆฌํ•ด๋ณธ๋‹ค. 

 


addTarget(_:action:for:) 

์ปจํŠธ๋กค๊ณผ ํƒ€๊ฒŸ ๊ฐ์ฒด ๋ฐ ์•ก์…˜ ๋ฉ”์„œ๋“œ๋ฅผ ์—ฐ๊ฒฐํ•ฉ๋‹ˆ๋‹ค.

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()

        let button = UIButton(type: .system)
        button.frame = CGRect(x: 100, y: 100, width: 200, height: 50)
        button.setTitle("Tap me", for: .normal)
        
        // self๋ฅผ target์œผ๋กœ ์„ค์ •
        button.addTarget(self, action: #selector(buttonTapped), for: .touchUpInside)
        self.view.addSubview(button)
    }

    @objc func buttonTapped() {
        // ์—ฌ๊ธฐ์„œ ์ด๋ฒคํŠธ๋ฅผ ์ฒ˜๋ฆฌํ•จ
        print("Button tapped!")
        // ์˜ˆ: ๋ผ๋ฒจ ์—…๋ฐ์ดํŠธ, ํ™”๋ฉด ์ „ํ™˜ ๋“ฑ
    }
}



 

๋งค๊ฐœ๋ณ€์ˆ˜

target 

์•ก์…˜ ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•  ๋Œ€์ƒ ๊ฐ์ฒด์ž…๋‹ˆ๋‹ค. ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ–ˆ์„ ๋•Œ ์•ก์…˜ ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•  ๊ฐ์ฒด๋ฅผ ์˜๋ฏธํ•œ๋‹ค. 

 

self๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ํ˜„์žฌ ํด๋ž˜์Šค(์ฃผ๋กœ ๋ทฐ ์ปจํŠธ๋กค๋Ÿฌ)๊ฐ€ ์ด๋ฒคํŠธ๋ฅผ ์ฒ˜๋ฆฌํ•œ๋‹ค.

→ ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ–ˆ์„ ๋•Œ ํ•ด๋‹น ์•ก์…˜ ๋ฉ”์„œ๋“œ๊ฐ€ ๋ทฐ ์ปจํŠธ๋กค๋Ÿฌ ํด๋ž˜์Šค ๋‚ด๋ถ€์—์„œ ์‹คํ–‰๋œ๋‹ค๋Š” ์˜๋ฏธ

 

 

๊ทธ๋Ÿผ self ๋Œ€์‹  ๋‹ค๋ฅธ ์ปจํŠธ๋กค๋Ÿฌ๋กœ ์„ค์ •ํ•˜๋ฉด ํ•ด๋‹น ์ปจํŠธ๋กค๋Ÿฌ์—์„œ ์‹คํ–‰๋˜๋Š”๊ฐ€?

Yes! ์ด๋ฒคํŠธ๋ฅผ ๋‹ค๋ฅธ ๋ทฐ ์ปจํŠธ๋กค๋Ÿฌ์—์„œ ์ฒ˜๋ฆฌํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด ๊ทธ ์ปจํŠธ๋กค๋Ÿฌ๋ฅผ target์œผ๋กœ ์ง€์ •ํ•˜๋ฉด ๋œ๋‹ค. 

class AnotherViewController: UIViewController {
    @objc func buttonTapped() {
        print("Button tapped in AnotherViewController!")
    }
}

class ViewController: UIViewController {
    let anotherVC = AnotherViewController()

    override func viewDidLoad() {
        super.viewDidLoad()

        let button = UIButton(type: .system)
        button.frame = CGRect(x: 100, y: 100, width: 200, height: 50)
        button.setTitle("Tap me", for: .normal)
        
        // anotherVC๋ฅผ target์œผ๋กœ ์„ค์ •
        button.addTarget(anotherVC, action: #selector(anotherVC.buttonTapped), for: .touchUpInside)
        self.view.addSubview(button)
    }
}

 

 

nil์„ ์‚ฌ์šฉํ•˜๋ฉด UIKit์€ ๋ฆฌ์Šคํฐ๋” ์ฒด์ธ์„ ๊ฒ€์ƒ‰ํ•ด ์•ก์…˜์„ ์ฒ˜๋ฆฌํ•  ์ ์ ˆํ•œ ๊ฐ์ฒด๋ฅผ ์ฐพ๋Š”๋‹ค. 

์ด๋ ‡๊ฒŒ ์„ค์ •ํ•˜๋ฉด ๋ฒ„ํŠผ์ด ๋ˆŒ๋ ธ์„ ๋•Œ ์ง€์ •ํ•œ ๋ฉ”์„œ๋“œ๊ฐ€ ํ˜ธ์ถœ๋˜์–ด ์ด๋ฒคํŠธ๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ฒŒ ๋œ๋‹ค. 

 

๋ฆฌ์Šคํฐ๋” ์ฒด์ธ

target์„ nil๋กœ ์ง€์ •ํ•˜๋ฉด UIKit์ด ๋ฆฌ์Šคํฐ๋” ์ฒด์ธ์„ ๊ฒ€์ƒ‰ํ•˜์—ฌ ํ•ด๋‹น ์•ก์…˜์„ ์ฒ˜๋ฆฌํ•  ๊ฐ์ฒด๋ฅผ ์ฐพ์Šต๋‹ˆ๋‹ค.

์ด๋Š” ์ด๋ฒคํŠธ๊ฐ€ ํŠน์ • ๊ฐ์ฒด์— ์˜ํ•ด ์ฒ˜๋ฆฌ๋˜์ง€ ์•Š์„ ๋•Œ, ํ•ด๋‹น ๊ฐ์ฒด์˜ ๋ถ€๋ชจ๋กœ ์ด๋ฒคํŠธ๊ฐ€ ์ „ํŒŒ๋˜๋Š” ๋ฉ”์ปค๋‹ˆ์ฆ˜์ž…๋‹ˆ๋‹ค.

์ด๋Ÿฌํ•œ ๋ฉ”์„œ๋“œ ์‚ฌ์šฉ ๋ฐฉ์‹์€ MVC ํŒจํ„ด์„ ์ž˜ ํ™œ์šฉํ•˜์—ฌ ์ฝ”๋“œ ๊ตฌ์กฐ๋ฅผ ๋ช…ํ™•ํ•˜๊ฒŒ ํ•˜๊ณ , ๋ทฐ์™€ ์ปจํŠธ๋กค๋Ÿฌ์˜ ์—ญํ• ์„ ๋ช…ํ™•ํžˆ ๊ตฌ๋ถ„ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋„์™€์ค๋‹ˆ๋‹ค. self๋ฅผ ์ง€์ •ํ•˜๋ฉด ์ด๋ฒคํŠธ ์ฒ˜๋ฆฌ ๋กœ์ง์ด ๋ทฐ ์ปจํŠธ๋กค๋Ÿฌ ๋‚ด๋ถ€์— ์žˆ์–ด ๊ด€๋ฆฌํ•˜๊ธฐ ์‰ฌ์šด ๊ตฌ์กฐ๊ฐ€ ๋ฉ๋‹ˆ๋‹ค.

 

 

action

ํ˜ธ์ถœํ•  ์•ก์…˜ ๋ฉ”์„œ๋“œ๋ฅผ Selector๋กœ ์ง€์ •ํ•œ๋‹ค. 

 

 

controlEvents

์–ด๋–ค ์ด๋ฒคํŠธ์— ๋ฐ˜์‘ํ• ์ง€ ์ง€์ •ํ•œ๋‹ค. 

 

 

 


์—ฌ๋Ÿฌ ๊ฐœ์˜ ๋ฒ„ํŠผ์—์„œ ๋™์ผํ•œ ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ?

1. ๊ฐ ๋ฒ„ํŠผ์— ๋™์ผํ•œ ํƒ€์ผ“๊ณผ ์•ก์…˜์„ ์„ค์ •ํ•œ๋‹ค. 

2. tag ์†์„ฑ์„ ์‚ฌ์šฉํ•ด ๊ฐ ๋ฒ„ํŠผ์— ๊ณ ์œ ํ•œ ํƒœ๊ทธ๋ฅผ ์ง€์ •ํ•ด ์–ด๋–ค ๋ฒ„ํŠผ์ด ๋ˆŒ๋ ธ๋Š”์ง€ ๊ตฌ๋ถ„ํ•  ์ˆ˜ ์žˆ๋‹ค. 

3. ์•ก์…˜ ๋ฉ”์„œ๋“œ๊ฐ€ ํ˜ธ์ถœ๋  ๋•Œ, UIButton ์ธ์Šคํ„ด์Šค๊ฐ€ sender(๋งค๊ฐœ๋ณ€์ˆ˜: ์ด๋ฒคํŠธ๋ฅผ ํŠธ๋ฆฌ๊ฑฐํ•œ ๊ฐ์ฒด. ์ฆ‰, ๋ฒ„ํŠผ)๋กœ ์ „๋‹ฌ๋ผ

์–ด๋–ค ๋ฒ„ํŠผ์ด ๋ˆŒ๋ ธ๋Š”์ง€ ์‹๋ณ„ํ•œ๋‹ค. 

 

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()

        // ์ฒซ ๋ฒˆ์งธ ๋ฒ„ํŠผ ์ƒ์„ฑ
        let button1 = UIButton(type: .system)
        button1.frame = CGRect(x: 100, y: 100, width: 200, height: 50)
        button1.setTitle("Button 1", for: .normal)
        button1.tag = 1
        button1.addTarget(self, action: #selector(buttonTapped(_:)), for: .touchUpInside)
        self.view.addSubview(button1)

        // ๋‘ ๋ฒˆ์งธ ๋ฒ„ํŠผ ์ƒ์„ฑ
        let button2 = UIButton(type: .system)
        button2.frame = CGRect(x: 100, y: 200, width: 200, height: 50)
        button2.setTitle("Button 2", for: .normal)
        button2.tag = 2
        button2.addTarget(self, action: #selector(buttonTapped(_:)), for: .touchUpInside)
        self.view.addSubview(button2)
    }

    @objc func buttonTapped(_ sender: UIButton) {
        if sender.tag == 1 {
            print("Button 1 tapped!")
        } else if sender.tag == 2 {
            print("Button 2 tapped!")
        }
    }
}

๊ด€๋ จ๊ธ€ ๋”๋ณด๊ธฐ