Swift/Xcode

[Swift] Delegate ํŒจํ„ด

yeggrrr๐Ÿผ 2024. 5. 26. 18:00
Delegate Pattern

 

Delegate ํŒจํ„ด์€ ๋””์ž์ธ ํŒจํ„ด ์ค‘ ํ•˜๋‚˜๋กœ
๋‹จ์–ด ๋œป ๊ทธ๋Œ€๋กœ '์œ„์ž„ํ•˜๋‹ค'์™€ ๊ฐ™์ด ํ•˜๋‚˜์˜ ๊ฐ์ฒด๊ฐ€ ๋ชจ๋“  ์ผ์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹Œ

๊ฐ์ฒด๊ฐ€ ๋‹ค๋ฅธ ๊ฐ์ฒด์—๊ฒŒ ์ž์‹ ์˜ ์ผ์„ ์œ„์ž„ํ•˜๋Š” ํ˜•ํƒœ์˜ ๋””์ž์ธ ํŒจํ„ด์ž…๋‹ˆ๋‹ค.


<์ด ํŒจํ„ด์˜ ์žฅ์ >
1. ํ”„๋กœํ† ์ฝœ์„ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์žฌ์‚ฌ์šฉ์„ฑ์ด ๋›ฐ์–ด๋‚˜๋‹ค.
2. ํ”„๋กœํ† ์ฝœ์— ํ•„์š”ํ•œ ๋ฉ”์„œ๋“œ๋“ค์ด ๋ช…์‹œ๋˜์–ด ์ „๋‹ฌ๋œ๋‹ค.
3. ์ฒ˜๋ฆฌํ•ด์•ผํ•˜๋Š” ์ผ์˜ ์ผ๋ถ€๋ฅผ ๋‹ค๋ฅธ ๊ฐ์ฒด์—๊ฒŒ ์œ„์ž„ํ•  ์ˆ˜ ์žˆ๋‹ค.




์ง€๊ธˆ๊นŒ์ง€ ์•ฑ์„ ๋งŒ๋“ค๋ฉด์„œ, ์•Œ๊ฒŒ ๋ชจ๋ฅด๊ฒŒ ์—ฌ๋Ÿฌ Delegate ํ”„๋กœํ† ์ฝœ์ด ์žˆ์—ˆ์„ ๊ฒ๋‹ˆ๋‹ค.
(UITableViewDelegate, UITextFieldDelegate, ๋“ฑ๋“ฑ..)

tableViewController๋„ command๋กœ ๋ˆŒ๋Ÿฌ๋ณด๋ฉด,
UITableViewDelegate๋ฅผ ์ฑ„ํƒํ•˜์—ฌ ํ”„๋กœํ† ์ฝœ์„ ์ค€์ˆ˜ํ•˜๊ณ  ์žˆ์Œ์„ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


์ด๋Ÿฌํ•œ Delegate ํ”„๋กœํ† ์ฝœ ๋ฉ”์„œ๋“œ๋“ค์€
์ด๋ฏธ ์• ํ”Œ์—์„œ ๋งŒ๋“ค์–ด ๋†“์•˜๊ธฐ ๋•Œ๋ฌธ์— ๊ฐœ๋ฐœ์ž๋“ค์€ ๋ชฉ์ ์— ๋งž๊ฒŒ ์„ ํƒํ•ด์„œ ์‚ฌ์šฉํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.


์• ํ”Œ์ด ์ง์ ‘ ๋งŒ๋“  Delegate ํ”„๋กœํ† ์ฝœ ๋ง๊ณ 
๊ฐœ๋ฐœ์ž๊ฐ€ ์ง์ ‘ Customํ•ด์„œ ๊ตฌํ˜„ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

์ง์ ‘ ํ”„๋กœํ† ์ฝœ์„ ๊ตฌํ˜„ํ•œ ํ›„, ๋™์ž‘์„ ์ •์˜ํ•˜๊ณ  ์›ํ•˜๋Š” ๊ฐ์ฒด์— ์œ„์ž„ํ•ด์ฃผ๋ฉด ๋ฉ๋‹ˆ๋‹ค.


1. Delegate ํ”„๋กœํ† ์ฝœ ์ƒ์„ฑ
2. ๋ฉ”์„œ๋“œ ์ •์˜
3. ์œ„์ž„์ž ์„ค์ •


์ œ๊ฐ€ Delegate ํŒจํ„ด์„ ์ฒ˜์Œ ์ ‘ํ•˜๊ฒŒ ๋œ ์ผ€์ด์Šค๋Š”
tableView๋ฅผ ์‚ฌ์šฉํ•ด์„œ todoList๋ฅผ ๋งŒ๋“œ๋Š”๋ฐ, ๋‘ ๊ฐœ์˜ Cell๊ณผ์˜ ์ƒํ˜ธ์ž‘์šฉ์ด ํ•„์š”ํ–ˆ๋˜ ์‹œ์ ์ด์—ˆ์Šต๋‹ˆ๋‹ค.

A Cell์—์„œ ์ถ”๊ฐ€ ๋ฒ„ํŠผ์„ ํด๋ฆญํ•˜๋ฉด,
B Cell์— ํ•ด๋‹น ๋‚ด์šฉ์ด ์ถ”๊ฐ€๋˜๋„๋ก ๊ตฌํ˜„ํ•ด์•ผ ํ–ˆ์Šต๋‹ˆ๋‹ค.

ํ•˜์ง€๋งŒ, ๊ฐ Cell ํŒŒ์ผ๋งˆ๋‹ค ๊ฐ๊ฐ ๊ตฌ์„ฑ๋˜์–ด ์žˆ๋Š” ์š”์†Œ๋“ค์„ Outlet ์—ฐ๊ฒฐ์„ ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์—
์ถ”๊ฐ€ ๋ฒ„ํŠผ์˜ Action์„ ์—ฐ๊ฒฐํ–ˆ์„ ๋•Œ,
๋‹ค๋ฅธ Cell์ด ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ์š”์†Œ์— ์ ‘๊ทผํ•  ์ˆ˜ ์—†์–ด์„œ
์›ํ•˜๋Š” ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์—†์—ˆ์ฃ ...๐Ÿคฏ

ํ‰์†Œ์— ํ•˜๋‚˜์˜ Cell ํŒŒ์ผ๋กœ ์ž‘์—…ํ•˜๋Š” ๊ฒฝํ—˜๋งŒ ์žˆ์—ˆ๊ธฐ ๋•Œ๋ฌธ์—
์ด๋Ÿฐ ๊ฒฝ์šฐ๋Š” ์–ด๋–ป๊ฒŒ ํ•ด์•ผํ•˜๋‚˜ ๋ฉ˜๋ถ•์ด ์™”์—ˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋•Œ, ๊ตฌ๊ธ€๋ง์„ ํ•ด๋ณด๋‹ˆ Delegate ํŒจํ„ด์„ ์‚ฌ์šฉํ•ด์„œ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์‚ฌ์‹ค์„ ์•Œ๊ฒŒ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.



์ œ๊ฐ€ ์‚ฌ์šฉํ–ˆ๋˜ ๋ฐฉ๋ฒ•์„ ์ •๋ฆฌํ•ด๋ณด๋ฉด,

1. Delegate ํ”„๋กœํ† ์ฝœ ์ƒ์„ฑ

2. Cell ํŒŒ์ผ์—์„œ ํ”„๋กœํ† ์ฝœ์„ ์ €์žฅํ•  ์ˆ˜ ์žˆ๋Š” ์ €์žฅ ํ”„๋กœํผํ‹ฐ ์ƒ์„ฑ


3. ๋ทฐ์ปจ์—์„œ 1๋ฒˆ์—์„œ ์ƒ์„ฑํ•œ ํ”„๋กœํ† ์ฝœ์„ ์ฑ„ํƒํ•˜๊ณ , ํ•„์š”ํ•œ ๋ฉ”์„œ๋“œ ๊ตฌํ˜„


4. ๋ทฐ์ปจ์˜ cellForRowAt์—์„œ cell์˜ ์ €์žฅ ํ”„๋กœํผํ‹ฐ delegate๋ฅผ self๋กœ ํ• ๋‹น

5. cell ๋‚ด๋ถ€์—์„œ ๋ฒ„ํŠผ ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด, ์ด delegate ํ”„๋กœํผํ‹ฐ์— ์ ‘๊ทผํ•˜์—ฌ ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ 


< 1 - VC >

protocol AddButtonDelegate: AnyObject {
    func addButtonClicked(textField: UITextField)
}


< 2 - Cell >

class TextFieldTableViewCell: UITableViewCell {
    static let identifier = "textFieldCell"
    
    weak var delegate: AddButtonDelegate? // ์ €์žฅ ํ”„๋กœํผํ‹ฐ ์ƒ์„ฑ
    
    @IBOutlet var inputTodoTextField: UITextField!
    @IBOutlet var addButton: UIButton!
}


< 3 - VC >

extension TodoListTableViewController: AddButtonDelegate {
    func addButtonClicked(textField: UITextField) {
       // ํ•„์š”ํ•œ ์š”๊ตฌ์‚ฌํ•ญ
    }
}


< 4 - VC: cellForRowAt >

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        if indexPath.section == 0 {
            guard let cell = tableView.dequeueReusableCell(withIdentifier: TextFieldTableViewCell.identifier, for: indexPath) as? TextFieldTableViewCell else { return UITableViewCell() }
            
            cell.delegate = self // self๋กœ ํ• ๋‹น

            // ๊ธฐํƒ€ ๊ตฌํ˜„ ์ฝ”๋“œ

            return cell
        }
    }


< 5 - Cell >

class TextFieldTableViewCell: UITableViewCell {
    static let identifier = "textFieldCell"
    
    weak var delegate: AddButtonDelegate?
    
    @IBOutlet var inputTodoTextField: UITextField!
    @IBOutlet var addButton: UIButton!
    
    @IBAction func addButtonClicked(_ sender: UIButton) {
        delegate?.addButtonClicked(textField: inputTodoTextField)
		// ์ด๋ฒคํŠธ ๋ฐœ์ƒ Action์—์„œ Delegate ํ”„๋กœํผํ‹ฐ์— ์ ‘๊ทผ -> ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ
    }
}



์ด๋ ‡๊ฒŒ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ–ˆ์Šต๋‹ˆ๋‹ค.

Delegate ํŒจํ„ด์„ ํ†ตํ•ด์„œ Cell์—์„œ ํ•„์š”ํ•œ ์‹œ์ ์— ํ•ด๋‹น ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜์—ˆ๊ณ ,
VC์—์„œ ํ•„์š”ํ•œ ๋ถ€๋ถ„๋“ค์„ ์œ„์ž„๋ฐ›์•„ ์ˆ˜ํ–‰ํ•˜๊ฒŒ ๋งŒ๋“ฌ์œผ๋กœ์„œ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๋ณด๋‹ค ํšจ์œจ์ ์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋์Šต๋‹ˆ๋‹ค. โ˜บ๏ธ





๋” ์ž์„ธํ•œ ์ •๋ฆฌ๋Š”
์ถ”ํ›„์— ์ถ”๊ฐ€์ ์œผ๋กœ ์ž‘์„ฑํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค!


๐Ÿ˜€ํ”ผ๋“œ๋ฐฑ์ด ์žˆ์œผ์‹œ๋‹ค๋ฉด, ์–ธ์ œ๋“ ์ง€ ๋Œ“๊ธ€๋กœ ์•Œ๋ ค์ฃผ์„ธ์š”!๐Ÿ˜€








728x90