Jiseob Kim

iOS Developer

Swift - UIButton๊ณผ ํด๋ž˜์Šค

15 Jul 2018 » Swift

์ด๋ฒˆ์˜ ์ฃผ์ œ๋Š” ํด๋ž˜์Šค๋ฅผ ์ข€ ๋” ์ž˜์จ๋ณด๊ธฐ ์œ„ํ•œ ๊ธ€์ด๋‹ค๋””์ž์ธ์  ์š”์†Œ์—์„œ class๋ฅผ ํšจ์œจ์ ์œผ๋กœ ์‚ฌ์šฉํ•ด๋ณด์ž


์ง€๊ธˆํ•˜๋Š” ํ”„๋กœ์ ํŠธ๋„ ๊ทธ๋ ‡๊ณ  ์–ด๋””์„œ๋“  ๋””์ž์ด๋„ˆ๋Š” ์žˆ๋‹ค. ๊ฐœ์ธ ํ”„๋กœ์ ํŠธ๋„ ๋ณธ์ธ์ด ๋””์ž์ด๋„ˆ์ธ๊ฒƒ์ด๋‹ค. ๋ฌผ๋ก  ํ€„๋ฆฌํ‹ฐ ์ฐจ์ด๋Š” ์–ด๋งˆ์–ด๋งˆํ•˜๋‹ค.

๊ทธ๋Ÿฐ๋ฐ ๋””์ž์ด๋„ˆ๊ฑด ๊ฐœ์ธํ”„๋กœ์ ํŠธ๊ฑด ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ค‘์— ๋ฐ˜๋ณต ๋˜๋Š” ์š”์†Œ๋Š” ์žˆ๊ธฐ๋งˆ๋ จ์ด๋‹ค. ์˜ˆ๋ฅผ ๋“ค์ž๋ฉด ์ €์žฅ ๊ฐ™์€ ๋ฒ„ํŠผ? ํ†ต์ผ์„ฑ๋„ ์žˆ์„ ๋ฟ๋”๋Ÿฌ ์‹œ๊ฐ„ ์ ˆ์•ฝ๋„ ๋˜๋Š” ๊ฒƒ ๊ฐ™๋‹ค.

์ด๋ฒˆ์—๋„ ์ด์ „๊ธ€๊ณผ ๊ฐ™์ด ์•„!! ์ด๋ ‡๊ฒŒ ์“ฐ๋ฉด ์ข‹๊ฒ ๋„ค! ํ•˜๋Š” ๊ฒฝ์šฐ์ด๋‹ค
์ด์ „๊ธ€: Class, Struct ๊ฐ’ ์ „๋‹ฌ ๋ฐฉ์‹์ด ๋‹ค๋ฅธ๊ฑด ์•Œ์ง€๋งŒ ์–ธ์ œ์“ฐ์ง€?

๋‹ค๋ฃจ๊ฒŒ ๋‚ด์šฉ์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค

  1. Class ์—†์ด ๊ตฌํ˜„
  2. Class ์‚ฌ์šฉํ•˜์—ฌ ๊ตฌํ˜„
  3. Class์˜ ์ƒ์† ์ด์šฉ

์˜ค๋Š˜์€ Play Grounds ๋ง๊ณ  Xcode๊ฐ€ ์‚ฌ์šฉ๋œ๋‹ค.

์šฐ์„  ํ™”๋ฉด์„ ๋ณด์ž, (์™ผ์ชฝ๋ถ€ํ„ฐ)

  1. ๋„ค๋น„๊ฒŒ์ด์…˜๋ฐ”
  2. ๋ฉ”์ธ ํ™”๋ฉด - ๋ฒ„ํŠผ ์„ ํƒ -> ์ž…๋ ฅํ™”๋ฉด์œผ๋กœ ์ด๋™
  3. ์ž…๋ ฅ ํ™”๋ฉด - ํ…์ŠคํŠธ ํ•„๋“œ ์ž…๋ ฅ ํ›„ ์ €์žฅ -> ๋ฉ”์ธ์œผ๋กœ ์ด๋™

๊ตฌ์„ฑ์€ ์˜ค๋Š˜๋„ ์‹ฌํ”Œํ•˜๋‹ค.

์—ฌ๋‹ด์œผ๋กœ Xcode๊ฐ€ ๋‹คํฌ๋ชจ๋“œ์ธ๊ฒƒ์€ WWDC 2018์—์„œ ๋ฐœํ‘œํ•œ ์ƒˆ๋กœ์šด macOS์ธ Mojave์—์„œ ์ง€์›ํ•˜๋Š” ๋‹คํฌ๋ชจ๋“œ์ด๋‹ค! ๋‹คํฌ๋ชจ๋“œ ๋ฐœํ‘œ๋•Œ ๊ฐœ๋ฐœ์ž๋“ค ํ™˜ํ˜ธ์„ฑ์ด ์ œ์ผ ํฌ๊ฒŒ ๋“ค๋ ธ๋˜ ๊ฒƒ ๊ฐ™๋‹ค. ํ˜„์žฌ ๋ฒ ํƒ€์—์„œ๋งŒ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•˜๋‹ค.

์—ฌ๊ธฐ์„œ ์ถ”๊ฐ€์ ์œผ๋กœ Xcode beta 10๋ฒ„์ „์—์„œ ์˜ค๋ธŒ์ ํŠธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ์œ„์น˜๊ฐ€ ๋ฐ”๋€Œ์—ˆ๋‹ค!

(Xcode9) ๊ธฐ์กด์˜ ์œ„์น˜๋Š” ์œ„ ์‚ฌ์ง„ ์ฒ˜๋Ÿผ ๋นจ๊ฐ„์ƒ‰ ์˜์—ญ์ด ์˜ค๋ธŒ์ ํŠธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ด๋‹ค.

๋ฐ”๋€ ์œ„์น˜๋ฅผ ๋ณด์ž (Xcode10 ๋ฒ ํƒ€) ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค. ๊ธฐ์กด์˜ ์˜์—ญ์€ ๋น„์–ด์žˆ๊ณ . ์ €๋ ‡๊ฒŒ ์ƒˆ๋กœ์šด ์ฐฝ์œผ๋กœ ์˜์—ญ์ด ๋ฐ”๋€Œ์—ˆ๋‹ค.
(๋‹จ์ถ•ํ‚ค : Shift - option - L)
(* bear ๊ธ€์“ฐ๊ธฐ ํ”„๋กœ๊ทธ๋žจ์— Xcode 10 ๋ฒ ํƒ€ ์ฝ”๋“œ ๋ณต๋ถ™ํ•˜๋ฉด ์ด์ƒํ•ด์„œ ๋‹ค์‹œ 9๋กœ ์‚ฌ์šฉ .. ใ… ใ… )

๋‹ค์‹œ ๋ณธ๋ก ์œผ๋กœ ๋Œ์•„๊ฐ€์„œ

์ฃผ๋ชฉํ•ด์•ผํ•  ๋ถ€๋ถ„์€ ์ €์žฅ ๋ฒ„ํŠผ์ด๋‹ค.

๊ธฐํš์ž: TextField๊ฐ€ ๊ธ€์ž ์žˆ๋Š”์ง€ ์—†๋Š”์ง€์— ๋”ฐ๋ผ,
์ €์žฅ ๋ฒ„ํŠผ ๋น„ํ™œ์„ฑํ™”/ํ™œ์„ฑํ™”๋กœ ํ•ด์ฃผ์„ธ์š”.

์ด๋Ÿฐ ๊ฒฝ์šฐ๋Š” ๋งŽ๊ณ  ๋งŽ์€ ์•ฑ๋“ค์—์„œ๋„ ๋ณด์ธ๋‹ค.

์—ฌ๊ธฐ์„œ ์ถ”๊ฐ€ ์กฐ๊ฑด

๋””์ž์ด๋„ˆ: ๋น„ํ™œ์„ฑํ™” ์ƒ‰์€ ํšŒ์ƒ‰, ํ™œ์„ฑํ™” ์ƒ‰์€ ๊ธฐ๋ณธ ํŒŒ๋ž€์ƒ‰์ด์š”

๋””์ž์ด๋„ˆ์˜ ์š”๊ตฌ์‚ฌํ•ญ์ด๋ผ ๊ฐ€์ •ํ•˜์ž.

๊ทธ๋Ÿผ ์š”์•ฝํ•˜์ž๋ฉด

  1. ๊ธ€์ž ์ž…๋ ฅ๋จ - ๊ธฐ๋ณธ์ƒ‰, ํ™œ์„ฑํ™”
  2. ๊ธ€์ž ์ž…๋ ฅ ์•ˆ๋จ - ํšŒ์ƒ‰, ๋น„ํ™œ์„ฑํ™”

(๊ธฐ๋ณธ ํ™”๋ฉด)

1. Class ์—†์ด ๊ตฌํ˜„

์–ด๋””์„œ ๋˜๋Š” ์–ด๋–ป๊ฒŒ ์ฒ˜๋ฆฌํ• ์ง€ ๋ถ€ํ„ฐ ๋ณด๋ฉด,

  1. ํ™”๋ฉด ์ง„์ž…์‹œ, ๋น„ํ™œ์„ฑํ™” ์ƒํƒœ - viewDidLoad()
  2. ๊ธ€์ž ์ž…๋ ฅ์‹œ - (TextField์˜ Editing Changed ์‚ฌ์šฉ)

1์„ ์ฝ”๋“œ๋กœ ํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค

@IBOutlet var btnSave:
override func viewDidLoad() {
        super.viewDidLoad()
        *// 1. ๋ฐ˜์‘ ์—†๊ฒŒ ๋น„ํ™œ์„ฑํ™”*
        btnSave.isUserInteractionEnabled = false
        *// 2. ํšŒ์ƒ‰์œผ๋กœ ๋ณ€๊ฒฝ*
        btnSave.setTitleColor(.gray, for: .normal)
    }

์•„์ฃผ ์•„์ฃผ ๊ฐ„๋‹จํ•˜๋‹ค. ๊ทธ๋Ÿผ ๋ฐ”๋กœ ์ด์–ด์„œ 2๋ฒˆ์งธ ์กฐ๊ฑด

Conection Inspector ์—์„œ

์—ฐ๊ฒฐ์€ ๋จผ์ € ํ•˜๊ณ 

์ฝ”๋“œ

@IBAction func editChanged(_ sender: UITextField) {
        // ์กฐ๊ฑด: ๊ธ€์ž๊ฐ€ ๋น„์–ด์žˆ๋Š”๊ฐ€??
        if sender.text?.isEmpty == true {
            // ๊ธ€์ž
            // 1. ๋ฐ˜์‘ ์—†๊ฒŒ ๋น„ํ™œ์„ฑํ™”
            btnSave.isUserInteractionEnabled = false
            // 2. ํšŒ์ƒ‰์œผ๋กœ ๋ณ€๊ฒฝ
            btnSave.setTitleColor(.gray, for: .normal)

        } else {
            // ๊ธ€์ž o
            // 1. ํ™œ์„ฑํ™”
            btnSave.isUserInteractionEnabled = true
            // 2. ๊ธฐ๋ณธ ์ƒ‰์œผ๋กœ ๋ณ€๊ฒฝ
            btnSave.setTitleColor(**self**.view.tintColor, for: .normal)
}

์ด๊ฒƒ๋„ ์•„์ฃผ ๊ฐ„๋‹จํ•˜๋‹ค.

๊ทธ๋ ‡์ง€๋งŒ ๊ฐ™์€ ์ฝ”๋“œ๊ฐ€ ๊ณ„์† ๋ฐ˜๋ณต ๋œ๋‹ค.

๋งˆ์Œ์— ์•ˆ๋“œ๋‹ˆ ํ•จ์ˆ˜๋กœ ๋นผ์ฃผ์ž.

ํ›จ์”ฌ ๊น”๋”ํ•˜๋‹ค.

์†”์งํžˆ ์ด๋ ‡๊ฒŒ๋งŒ ๋๋‚ด๋ฉด Class๊ฐ€ ์™œํ•„์š”ํ•ด? ๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ์œ„์˜ ํ™œ์„ฑ,๋น„ํ™œ์„ฑํ™”๋ฅผ ํ•จ์ˆ˜๋กœ ๋งŒ๋“  ์ด์œ ๋ฅผ ๋‹ค์‹œ ์ƒ๊ฐํ•ด๋ณด์ž.

  • ๊ฐ™์€ ์ฝ”๋“œ๊ฐ€ ๋ฐ˜๋ณต๋œ๋‹ค
  • ์ •๋ฆฌ ์•ˆํ•˜๋ฉด ์ฝ”๋“œ๊ฐ€ ์ง€์ €๋ถ„ํ•ด ๋ณด์ธ๋‹ค.
  • ๋งŒ์•ฝ 1๊ฐœ๋ผ๋„ ๋ณ€๊ฒฝํ•˜๋ฉด ๋ชจ๋“  ๋ถ€๋ถ„์„ ์ฐพ์•„ ๋ฐ”๊ฟ”์•ผํ•œ๋‹ค

์—ฌ๊ธฐ์„œ ์†”์งํ•˜๊ฒŒ 2๋ฒˆ์งธ ๋ถ€๋ถ„์€ ๋ญ ๊ทธ๋Ÿฌ๋ ค๋‹ˆ ํ• ์ˆ˜์žˆ๋‹ค. ๊ทธ์น˜๋งŒ 1,3๋ฒˆ ๋ฌธ์ œ๊ฐ€ ์ •๋ง ํฌ๋‹ค 1๋ฒˆ ๋•Œ๋ฌธ์— 3๋ฒˆ์ด ๋ฐœ์ƒํ•˜๋Š” ๊ฒƒ์ธ๋ฐ, ์ง€๊ธˆ์ด ํ™”๋ฉด์ด 1๊ฐœ๋ผ ๊ทธ๋ ‡์ง€ ๋งŽ๋‹ค๊ณ  ํ•˜๋ฉด ๋”์ฐํ•˜๋‹ค

ํ™”๋ฉด์ด 1๊ฐœ๊ฐ€ ์•„๋‹ˆ๋ผ๋ฉด?

๋งŒ์•ฝ์— ์ž…๋ ฅํ•ด์•ผํ•  ํ™”๋ฉด์ด 1๊ฐœ๊ฐ€ ์•„๋‹ˆ๊ณ 

  1. ์ด๋ฆ„ ์ž…๋ ฅ
  2. ์ด๋ฉ”์ผ ์ž…๋ ฅ
  3. ์ „ํ™”๋ฒˆํ˜ธ ์ž…๋ ฅ

์œ„์ฒ˜๋Ÿผ ์ž…๋ ฅ ํ™”๋ฉด์ด ์—ฌ๋Ÿฌ๊ฐœ์ผ ๊ฒฝ์šฐ ์–ด๋–ป๊ฒŒ ํ•  ๊ฒƒ์ธ๊ฐ€?

๊ฐ UIVIewController ํด๋ž˜์Šค ๋งˆ๋‹ค ํ•จ์ˆ˜๋ฅผ ๋งŒ๋“ค๊ฒƒ์ธ๊ฐ€?? ๊ทธ๋Ÿผ ๋‹ค์‹œ ๋˜‘๊ฐ™์€ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.

  • ๊ฐ™์€ ์ฝ”๋“œ๊ฐ€ ๋ฐ˜๋ณต๋œ๋‹ค
  • ์ •๋ฆฌ ์•ˆํ•˜๋ฉด ์ฝ”๋“œ๊ฐ€ ์ง€์ €๋ถ„ํ•ด ๋ณด์ธ๋‹ค.
  • ๋งŒ์•ฝ 1๊ฐœ๋ผ๋„ ๋ณ€๊ฒฝํ•˜๋ฉด ๋ชจ๋“  ๋ถ€๋ถ„์„ ์ฐพ์•„ ๋ฐ”๊ฟ”์•ผํ•œ๋‹ค

๊ทธ๋ ‡๋‹ค๋ฉด ์–ด๋–ป๊ฒŒ ํ• ๊นŒ? ๋ฐฉ๋ฒ•์€ 2๊ฐ€์ง€ ์ •๋„ ์ƒ๊ฐ์ด ๋‚œ๋‹ค

  1. Util ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“ค์–ด์„œ ๊ทธ์•ˆ์— ํ•จ์ˆ˜๋ฅผ ๋งŒ๋“ค๊ณ  ๊ณตํ†ต์ ์œผ๋กœ ํ˜ธ์ถœํ•œ๋‹ค. (๊ด€๋ฆฌํ•˜๊ธฐ ํŽธํ•˜๊ฒŒ Util์— ๋ชจ์Œ)
  2. UIButton์„ ์ƒ์†ํ•œ ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“ค์–ด์„œ ์‚ฌ์šฉํ•œ๋‹ค.

๋‘˜์€ ๋น„์Šทํ•˜๋‹ค. ์ฐจ์ด๊ฐ€ ์žˆ๋‹ค๋ฉด ๊ธฐ๋Šฅ์€ ๊ฐ™์ง€๋งŒ ์•ฝ๊ฐ„์˜ ์ฐจ์ด์ ์ด ์žˆ๋Š” ๋ฒ„ํŠผ ์„ ๋งŒ๋“ค์–ด์•ผํ•œ๋‹ค๋ฉด ์ฐจ์ด๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด ์•„๋ž˜ ์‚ฌ์ง„์„ ๋ณด์ž ์ƒˆ๋กœ์šด ๋ฒ„ํŠผ์ด ์ƒ๊ฒผ๋‹ค. ์ €์žฅ ํ›„ ๋ฉ”์ธ์œผ๋กœ ๋Œ์•„๊ฐ€๋Š” ๋ฒ„ํŠผ์ด๋‹ค. ๊ธฐ๋Šฅ์€ ๋™์ผํ•˜๋‹ค๊ณ  ํ–ˆ์„๋•Œ ์ฐจ์ด์ ์ด ์žˆ๋‹ค.

  • ๋ฐฐ๊ฒฝ์ƒ‰
  • cornerRadius๊ฐ€ ์žˆ๋‹ค.

๊ธฐ์กด ๋ฌธ์ œ์˜€๋˜ ๋ฐ”๋€Œ์—ˆ์„ ๊ฒฝ์šฐ ์–ด๋–ป๊ฒŒ ํ• ๊ฒƒ์ธ๊ฐ€? ์™€๋Š” ๋‹ค๋ฅธ ๋ฌธ์ œ๋‹ค. ์™œ๋ƒ๋ฉด ํ•จ์ˆ˜ ๋‚ด์—๊ฒƒ์„ ๋ฐ”๊พธ๋ฉด ๋ชจ๋‘ ๋ฐ”๋€Œ์ง€๋งŒ ์ด๊ฑด ์„ฑ๊ฒฉ์ด ์ข€ ๋‹ค๋ฅธ์• ๊ฐ€ ์ƒ๊ธด๊ฑฐ๋‹ˆ๊น,

๋ฌผ๋ก  ์ธ์ž๋ฅผ ๋ฐ›์•„์„œ ๋‹ค๋ฅด๊ฒŒ ์ฒ˜๋ฆฌ ํ• ์ˆ˜๋Š” ์žˆ๋‹ค! ๊ทธ๋ ‡์ง€๋งŒ ํด๋ž˜์Šค์˜ ์ƒ์†์„ ์ด์šฉํ•œ๋‹ค๋ฉด ๋” ํŽธํ•˜๊ฒŒ ํ•  ์ˆ˜ ์žˆ๋‹ค.

Class ์‚ฌ์šฉํ•˜์—ฌ ๊ตฌํ˜„

์šฐ์„  ๊ฐ€์žฅ ๊ธฐ๋ณธ์ด ๋˜๋Š” ๋ฒ„ํŠผ์˜ ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“ค์–ด๋ณด์ž

class DefaultBtn: UIButton {
    // 1. ์Šคํ† ๋ฆฌ๋ณด๋“œ๋กœ ๋ฒ„ํŠผ ๊ตฌํ˜„์‹œ
    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
    }
    // 2. ์ฝ”๋“œ๋กœ ๋ฒ„ํŠผ์„ ๊ตฌํ˜„์‹œ
    override init(frame: CGRect) {
        super.init(frame: frame)
    }
}

UIButton์„ ์ƒ์† ๋ฐ›์€ ํด๋ž˜์Šค์ด๋‹ค. 2๊ฐ€์ง€ ์ดˆ๊ธฐํ™” ๊ตฌ๋ฌธ์ด ์žˆ๋‹ค. ์œ„์— ์ฃผ์„์„ ๋‹ฌ์•„ ๋†“์€๋“ฏ์ด
1์€ ์Šคํ† ๋ฆฌ๋ณด๋“œ์—์„œ ๋ฒ„ํŠผ์„ ์ถ”๊ฐ€ํ• ๊ฒฝ์šฐ ์‚ฌ์šฉ๋  init ๊ตฌ๋ฌธ
2๋Š” ์ฝ”๋“œ๋กœ ๊ตฌํ˜„ํ• ์‹œ ์‚ฌ์šฉ

1์„ ์ด์šฉํ•ด์„œ๋„ ์ฝ”๋“œ๋กœ ์งค์ˆ˜๋Š” ์žˆ์ง€๋งŒ ํ•ด๋‹น๋ถ€๋ถ„์€ ์•„์ง ํ•„์ž๋„ ์ž˜๋ชจ๋ฅด๋Š” ์˜์—ญ

์šฐ๋ฆฌ๊ฐ€ ์ด์šฉํ•  ์ƒํƒœ๋ฅผ enum์„ ์ด์šฉํ•ด์„œ ํ‘œํ˜„ํ•ด๋ณด์ž

class DefaultBtn: UIButton {

    // ๋ฒ„ํŠผ ์ƒํƒœ ์ข…๋ฅ˜
    enum btnState {
        case On
        case Off
    }

    // ๊ธฐ๋ณธ ๊ฐ’ = off ์ƒํƒœ
    var isOn: btnState = .Off

    // on ์ปฌ๋Ÿฌ
    var onTintColor: UIColor = UIColor(red: 0, green: 122/255, blue: 1/255, alpha: 1)

    // off ์ปฌ๋Ÿฌ
    var offTintColor: UIColor = .gray

// ----------- ๊ธฐ์กด ์ฝ”๋“œ
}

๊ธฐ์กด ํด๋ž˜์Šค์—์„œ ์ถ”๊ฐ€๋˜์—ˆ๋‹ค. enum์„ ์š”์ฆ˜ ์ž์ฃผ ์ด์šฉํ•˜๋Š”๋ฐ, ๋”ฑ ํ•„์š”ํ•œ ์ผ€์ด์Šค๋“ค๋งŒ ๋‚˜์—ดํ•˜์—ฌ, ๋‹ค๋ฅธ ๊ฐ’์„ ๋ฐฉ์ง€ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, switch๋ฌธ๊ณผ ๊ฐ™์ด ์“ฐ๋ฉด ๊ต‰์žฅํžˆ ์ข‹๋‹ค. ์ถ”๊ฐ€์ ์œผ๋กœ ์ปฌ๋Ÿฌ๊ฐ’๋„ ์ง€์ •ํ•ด๋†“์•˜๋‹ค.

๊ทธ๋Ÿผ ์ด์ œ ์…‹ํŒ…์„ ํ•ด๋ณด์ž

class DefaultBtn: UIButton {

    // ๋ฒ„ํŠผ ์ƒํƒœ ์ข…๋ฅ˜
    enum btnState {
        case On
        case Off
    }

    // ๊ธฐ๋ณธ ๊ฐ’ = off ์ƒํƒœ
    var isOn: btnState = .Off {
        didSet {
            setting()
        }
    }

	  //.. ์ปฌ๋Ÿฌ๋ณ€์ˆ˜ ์ƒ๋žต
    // 1. ์Šคํ† ๋ฆฌ๋ณด๋“œ๋กœ ๋ฒ„ํŠผ ๊ตฌํ˜„์‹œ
    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
        // ๊ธฐ๋ณธ ์…‹ํŒ…
        setting()
    }
    // 2. ์ฝ”๋“œ๋กœ ๋ฒ„ํŠผ์„ ๊ตฌํ˜„์‹œ
    override init(frame: CGRect) {
        super.init(frame: frame)
        // ๊ธฐ๋ณธ ์…‹ํŒ…
        setting()
    }


    func setting() {
        // on ์ปฌ๋Ÿฌ (๊ธฐ๋ณธ์ƒ‰)

        switch isOn {
        case .On:
            self.setTitleColor(onTintColor, for: .normal)
            self.isUserInteractionEnabled = true
        case .Off:
            self.setTitleColor(offTintColor, for: .normal)
            self.isUserInteractionEnabled = false
        }
    }
}

์ฐจ์ด์ ์€ ์„ธ๊ฐ€์ง€๊ฐ€ ์žˆ๋‹ค

  1. setting() ํ•จ์ˆ˜๊ฐ€ ์ƒ๊ธด๊ฒƒ
  2. setting ํ•จ์ˆ˜๊ฐ€ init๊ตฌ๋ฌธ์— ์ ์šฉ๋œ๊ฒƒ
  3. isOn ๋ณ€์ˆ˜์— didSet์„ ์ถ”๊ฐ€

์„ค๋ช…์ด ํ•„์š”ํ•œ๊ฑด 3๋ฒˆ๋งŒ ์„ค๋ช…ํ•˜๋ฉด ๋  ๊ฒƒ ๊ฐ™๋‹ค, 3๋ฒˆ didSet์˜ ๊ฒฝ์šฐ ํ•ด๋‹น ๋ณ€์ˆ˜๊ธฐ ์ดˆ๊ธฐํ™” ๋˜์—ˆ์„๋•Œ, ํ˜ธ์ถœ๋˜๋Š” ๋‚ด์šฉ์ด๋‹ค. ์ด๊ฒƒ๋„ ์ž˜ ํ™œ์šฉํ•˜๋ฉด ์žฅ์ ์ด ๋งŽ๋‹ค.

๋ญ”๊ฐ€ ๋ณด๊ธฐ์—” ๋ญ์•ผ? ์˜คํžˆ๋ ค ๋” ํž˜๋“ ๋ฐ? ํ• ์ˆ˜ ์žˆ๋‹ค, ๊ทธ๋ ‡์ง€๋งŒ ์ฒ˜์Œ์— ์…‹ํŒ…๋งŒ ์–ด๋ ต์ง€ ์‚ฌ์šฉ์€ ์•„์ฃผ ๊ฐ„๋‹จํ•˜๋‹ค.

์šฐ์„  ๋ฒ„ํŠผ์— ํด๋ž˜์Šค๋ฅผ ๋„ฃ์–ด์ฃผ๊ณ  IBOutlet๋„ ๋ณ€๊ฒฝ

//@IBOutlet var btnSave: UIButton!
@IBOutlet var btnSave: AnotherBUtton!

๊ทธ๋Ÿผ ์ด์ œ ์‚ฌ์šฉํ•ด๋ณด์ž

class AddNameViewController: UIViewController {
    @IBOutlet var btnSave: DefaultBtn!

    override func viewDidLoad() {
        super.viewDidLoad()
        // ๋ฒ„ํŠผ ๋น„ํ™œ์„ฑํ™”
        btnSave.isOn = .Off
    }

    @IBAction func editChanged(_ sender: UITextField) {
        // ์กฐ๊ฑด: ๊ธ€์ž๊ฐ€ ๋น„์–ด์žˆ๋Š”๊ฐ€??
        if sender.text?.isEmpty == true {
            // ๋ฒ„ํŠผ ๋น„ํ™œ์„ฑํ™”
            btnSave.isOn = .Off
        } else {
            // ๋ฒ„ํŠผ ํ™œ์„ฑํ™”
            btnSave.isOn = .On
        }
    }
}

์‹ฌํ”Œ์˜ ๋์ด๋‹ค. ๋งˆ์Œ์— ํ‰ํ™”๊ฐ€ ์ฐพ์•„์˜จ๋‹คโ€ฆ.

๋ฌผ๋ก  ์ „์—ญ ํ•จ์ˆ˜๋กœํ•ด๋„ ํ•œ์ค„๋กœ ํ•˜๋ฉด ๋์ด๊ธด ํ•˜์ง€๋งŒ ์œ„์— ๋งํ–ˆ๋“ฏ์ด ์ฐจ์ด์ ์ด ์žˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  enum์„ ์จ์„œ ๊ฐ€๋…์„ฑ๋„ ํ›จ์”ฌ ์ข‹๋‹ค. ์‚ฌ์šฉ์„ฑ๋„ ์ข‹๋‹ค, ์•„๋ž˜ ์‚ฌ์ง„์ฒ˜๋Ÿผ .์„ ๋ˆ„๋ฅด๋ฉด ์•Œ์•„์„œ ๋‚˜์˜ค๋‹ˆ๊น ๋‹ค๋ฅธ๊ณณ์—์„œ๋„ ์ ์ ˆํžˆ ์ž˜ ์‚ฌ์šฉํ•˜์ž.

๊ทธ๋ ‡๋‹ด ์•„๊นŒ ๋ฌธ์ œ๊ฐ€ ๋˜์—ˆ๋˜ ํ™œ์„ฑ/ ๋น„ํ™œ์„ฑ์€ ๊ฐ™์œผ๋‚˜ ํŠน์„ฑ์ด ๋‹ค๋ฅธ๊ฒƒ์€ ์–ด๋–ป๊ฒŒ ๊ตฌํ˜„์„ ํ• ๊นŒ?

Class ์ƒ์†์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ตฌํ˜„

์•„๊นŒ ๋งŒ๋“ค์–ด๋‘” ํด๋ž˜์Šค๋ฅผ ์ƒ์†ํ•˜๋Š” ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“ค๊ณ  override๋ฅผ ์ด์šฉํ•˜๋Š” ๊ฒƒ์ด ๊ฒฐ๋ก ์ด๋‹ค.

๋งŒ์•ฝ ์ „์—ญ ํ•จ์ˆ˜๋‚˜ Util ํด๋ž˜์Šค๋ฅผ ์ƒ์„ฑํ•ด์„œ ๊ฑฐ๊ธฐ๋‹ค๊ฐ€ ํ•จ์ˆ˜๋ฅผ ๋งŒ๋“ค์–ด์„œ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด

  1. ์˜ค๋ฒ„๋กœ๋“œ๋ฅผ ์ด์šฉํ•ด์„œ ๊ฐ™์€ ์ด๋ฆ„์˜ ํ•จ์ˆ˜๋ฅผ ์—ฌ๋Ÿฌ๊ฐœ ๋งŒ๋“ ๋‹ค
  2. ์ธ์ž๊ฐ’์— ๋”ฐ๋ผ ๋‹ค๋ฅด๊ฒŒ ์ฒ˜๋ฆฌ๋˜๊ฒŒ ํ•œ๋‹ค ๋ผ๋˜๊ฐ€, ๋ญ ๋ฐฉ์‹์€ ์žˆ๋‹ค. ๊ทธ๋ ‡์ง€๋งŒ ๊ฐ€๋…์„ฑ๋„ ์•ˆ์ข‹๋‹ค!

๋ฐฐ๊ฒฝ์ƒ‰๊ณผ cornerRadius์ด ์ฒจ๊ฐ€๋œ ํ™œ์„ฑ/๋น„ํ™œ์„ฑ ๋ฒ„ํŠผ ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“ค์–ด๋ณด์ž

class BtnWithBackGroundColor: DefaultBtn {
    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
        // ์ƒˆ๋กœ์šด ์กฐ๊ฑด
        addSomeThing()
    }

    override init(frame: CGRect) {
        super.init(frame: frame)
        // ์ƒˆ๋กœ์šด ์กฐ๊ฑด
        addSomeThing()
    }

    func addSomeThing() {
        self.backgroundColor = .green
        self.layer.cornerRadius = 5
    }
}

์ฒ˜์Œ์— ๋งŒ๋“  ํด๋ž˜์Šค๋ณด๋‹ค ๊ต‰์žฅํžˆ ๊ฐ„๋‹จํ•˜๋‹ค. ๋‚ด๊ฐ€ ์ƒˆ๋กœ ํ•„์š”ํ•œ๊ฒƒ๋งŒ override ํ•ด์ฃผ๊ณ  ๊ธฐ์กด๊ฒƒ์€ ๊ทธ๋Œ€๋กœ ๊ฐ€์ ธ๋‹ค ์“ด๋‹ค.

์‚ฌ์šฉ๋ฒ•์€? ๊ฐ™๋‹ค

class AddNameViewController: UIViewController {

    @IBOutlet var btnSave: DefaultBtn!
    @IBOutlet var btnSave2: BtnWithBackGroundColor!


    override func viewDidLoad() {
        super.viewDidLoad()
        // ๋ฒ„ํŠผ ๋น„ํ™œ์„ฑํ™”
        btnSave.isOn = .Off
    }


    @IBAction func editChanged(_ sender: UITextField) {

        // ๊ธฐ์กด ์ƒ๋žต..

        // ๋ฐฐ๊ฒฝ์ƒ‰ ์žˆ๋Š” ๋ฒ„ํŠผ
        if sender.text?.isEmpty == true {
            btnSave2.isOn = .Off
        } else {
            btnSave2.isOn = .On
        }
    }
}

์‹คํ–‰ ์‚ฌ์ง„์€? ์ž˜๋‚˜์˜จ๋‹ค

๋””์ž์ด๋„ˆ: ์ €์žฅํ›„ ๋ฉ”์ธ ๊ฐ€๋Š” ๋ฒ„ํŠผ ๊ธ€์ž ํฌ๊ธฐ๋Š” ๋ณผ๋“œ17๋กœ, ๊ธ€์ž์ƒ‰์€ ๋น„ํ™œ์„ฑ:ํฐ์ƒ‰, ํ™œ์„ฑ: ๋นจ๊ฐ„์ƒ‰์œผ๋กœ ๋ณ€๊ฒฝํ•ด์ฃผ์„ธ์š”

์ด๋Ÿด ๊ฒฝ์šฐ ์–ด๋–ป๊ฒŒ ํ•˜๋ฉด ๋˜๋Š”๊ฐ€!

BtnWithBackGroundColor ํด๋ž˜์Šค์˜ addSomeThing() ๋งŒ ์†๋ณด๋ฉด ๋œ๋‹ค

func addSomeThing() {
        self.backgroundColor = .green
        self.layer.cornerRadius = 5
        // ์ถ”๊ฐ€ ์š”์ฒญ
        self.titleLabel?.font = UIFont.boldSystemFont(ofSize: 17) // ํฐํŠธ ๋ณผ๋“œ ๋ฐ ์‚ฌ์ด์ฆˆ 17
        self.offTintColor = .white // off ์ปฌ๋Ÿฌ ํฐ์ƒ‰
        self.onTintColor = .red // on ์ปฌ๋Ÿฌ ๋ ˆ๋“œ
        self.setting() // ๋ฐ”๋€๊ฒƒ์œผ๋กœ ์…‹ํŒ… !
    }

์ €๋ ‡๊ฒŒ๋งŒ ์ถ”๊ฐ€ํ•ด์ฃผ๋ฉด ์•„๋ž˜ ์‚ฌ์ง„์ฒ˜๋Ÿผ ๋ฐ”๋€๊ฒŒ ๋‚˜์˜ค๊ฒŒ ๋œ๋‹ค! ์ €๊ธฐ๋งŒ ์†๋ณด๊ณ  ์—ฌ๋Ÿฌ๊ณณ์˜ ๋ฒ„ํŠผ๋“ค์„ ํ•œ๊บผ๋ฒˆ์— ์ˆ˜์ •์ด ๋œ๋‹ค๋‹ˆ ๋„ˆ๋ฌด์ข‹๋‹ค.

๋‹ค๋งŒ ์ดํ•ด ์•ˆ๋  ์†Œ์ง€๊ฐ€ ์žˆ๋Š”๊ฑด self.setting()์ธ๋ฐ, ์ €๊ฒƒ์„ ์•ˆํ•ด์ฃผ๋ฉด ์ปฌ๋Ÿฌ๊ฐ’์ด ์•ˆ๋ณ€ํ•œ๋‹ค. ์ € ๋ณ€์ˆ˜๋“ค์€ setting()์—์„œ ์‚ฌ์šฉ์ด ๋˜๋Š”๋ฐ, init ๊ตฌ๋ฌธ์—์„œ ๋ถ€๋ชจํด๋ž˜์Šค๊ฐ€ ์‚ฌ์šฉ์„ ํ•˜๊ณ  ๋ฐ”๋€ ๊ฐ’์œผ๋ก  ์‚ฌ์šฉ์ด ์•ˆ๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค!

๋งŒ์•ฝ ์—ฌ๋Ÿฌ๊ฐ€์ง€ ๋ณตํ•ฉ ์ ์œผ๋กœ ์ถ”๊ฐ€ํ•  ๊ฒฝ์šฐ์—๋„ ํฌ๊ฒŒ ๋‹ค๋ฅด์ง€ ์•Š์ง€๋งŒ ๋งŒ๋“ค๊ธฐ ํŽธํ•จ๊ณผ ์œ ์ง€๋ณด์ˆ˜ ๋ฉด์—์„œ๋„ ๊ต‰์žฅํžˆ ํŽธ๋ฆฌํ•˜๊ฒŒ ์ง„ํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค.

์ด๋ ‡๊ฒŒ ํ•ด๋‘๋ฉด, ์š”์ฒญ์œผ๋กœ ์ธํ•ด์„œ ๋ณ€๊ฒฝํ• ๋•Œ๋„ ํ•œ๊บผ๋ฒˆ์— ๋ณ€๊ฒฝ ๋ฐ ์ˆ˜์ •์ด ๊ฐ€๋Šฅํ•˜๋‹ˆ ํ•„์š”ํ•œ๊ณณ์— ์ž˜์‚ฌ์šฉํ•˜๋ฉด ์ข‹์„ ๊ฒƒ ๊ฐ™๋‹ค!

์ •๋ง ์‹ฌํ”Œํ•œ ์˜ˆ์ œ๋กœ ์‹œ์ž‘์„ ํ•˜์˜€๊ณ , ์•„์ง ๋ณต์žกํ•œ ๊ณณ์—” ๋งŽ์ด ์ด์šฉ์•ˆํ•ด๋ดค์ง€๋งŒ ์ข€๋” ์“ธ๊ณณ์„ ์ฐพ์•„๋ด์•ผ๊ฒ ๋‹ค.