Jiseob Kim

iOS Developer

Swift - Tag ์•Œ์•„๋ณด๊ธฐ

04 Nov 2018 » Swift

์ด๋ฒˆ์— ์ฃผ์ œ๋Š” Tag์— ๊ด€ํ•˜์—ฌ ์จ๋ณผ๊นŒ ํ•œ๋‹ค.

ํƒœ๊ทธ๋„ ์ฐธ ์ข‹์€ ๊ธฐ๋Šฅ์ธ๋ฐ, ์ฑ…์—์„  ์ž˜ ๋ชป๋ณด๋‹ค ๋ณด๋‹ˆ

๊ฐ„๊ณผํ•˜๋˜ ๊ธฐ๋Šฅ์ด์—ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‹ค ๋ง‰์ƒ ์“ฐ๋ ค๋‹ˆ ๊ฐœ๋…์ด ํ—ท๊ฐˆ๋ ค์„œ

์ž ๊น ์จ๋ณผ๊นŒ ํ•˜๋‹ค๊ฐ€ ๋ญ์•ผ ํ•˜๊ณ  ๋‚˜์ค‘์— ์ฐพ์•„๋ด์•ผ์ง€ ํ•˜๋‹ค๊ฐ€

๋‚˜์ค‘์— ๋ณ‘์ด๋ผ๋„ ๊ฑธ๋ ธ๋‚˜, ๊ฒฐ๊ตญ ์•ˆ์ฐพ์Œ

๊ทธ๋ž˜์„œ ์“ฐ๋‹ค ์„œ์„œํžˆ ๊ฐ์ด ์™€์„œ ๋ธ”๋กœ๊ทธ๋กœ ์จ๋ณด๋ฉด์„œ

์ •๋ฆฌ๋ฅผ ํ•˜๊ณ ์ž ํ•œ๋‹ค.



์ดํ•ดํ•˜๊ธฐ

์‚ฌ์šฉ ๋ฐฉ๋ฒ•์€ ๊ต‰์žฅํžˆ ๋‹จ์ˆœํ•˜๋‹ค.

  • ํƒœ๊ทธ ๋ฒˆํ˜ธ ์ž…๋ ฅ ( ์ž…๋ ฅ์•ˆํ• ์‹œ default : 0 )
  • ์–ด๋–ค ํƒœ๊ทธ๊ฐ€ ๋ถ™์€ ์˜ค๋ธŒ์ ํŠธ๊ฐ€ ํ•„์š”ํ•˜๋ฉด ํƒœ๊ทธ ๋ฒˆํ˜ธ๋กœ ๊ฐ์ฒด ์ƒ์„ฑํ•˜์—ฌ ์ฒ˜๋ฆฌ

์‹ฌํ”Œํ•˜๋‹ค, ์˜ˆ๋ฅผ ๋“ค์–ด ์–ด๋Š ๊ธฐ๋Šฅ์ƒ label์„ ์ถ”๊ฐ€ํ•˜๊ณ  (Tag: 1์œผ๋กœ ์ง€์ •ํ–ˆ๋‹ค ๊ฐ€์ •)

๋‹ค๋ฅธ ๊ณณ์—์„œ ํ…์ŠคํŠธ๋ผ๋˜๊ฐ€, ์ƒ‰์„ ๋ฐ”๊พธ๊ณ  ์‹ถ๋‹ค. ๊ทธ๋Ÿผ ํ•ด๋‹น ํƒœ๊ทธ ๋ฒˆํ˜ธ๋ฅผ ๊ฐ€์ง„

์ƒˆ๋กœ์šด ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค๊ณ , ์„ค์ •์„ ๋ฐ”๊พธ๋ฉด ๋œ๋‹ค.

๊ทธ๋Ÿฐ๋ฐ, ์ฒ˜์Œ์— ํ—ท๊ฐˆ๋ฆฐ๊ฑด ์˜คํžˆ๋ ค ๋„ˆ๋ฌด ๋‹จ์ˆœํ•ด์„œ์˜€๋‹ค.

โ€˜๋” ์ƒ์œ„ ๋ทฐ์—์„œ ํƒœ๊ทธ ๋ฒˆํ˜ธ ์ง€์ •ํ•˜๋ฉด ํ˜ธ์ถœ์ด ๊ฐ€๋Šฅํ• ๊นŒ?โ€™

โ€˜๊ฐ™์€ ๋ฒˆํ˜ธ ๋„ฃ์œผ๋ฉด ์–ด๋–ป๊ฒŒ ๋˜์ง€? ๋ˆ„๊ฐ€ ํ˜ธ์ถœ ๋ ๊นŒ? ๋‘˜๋‹ค? ํ•˜๋‚˜๋งŒ?โ€™

์•„์ด๋Ÿฌ๋‹ˆํ•˜๊ฒŒ๋„ ์ด๋Ÿฌํ•œ ๋‹จ์ˆœํ•จ์— ์˜ํ•ด ์ƒ๊ธด ์–ด๋ ค์›€ ๋•Œ๋ฌธ์— ์“ฐ๊ธฐ ์–ด๋ ค์› ๋‹ค.


์‚ฌ์šฉ๋ฒ•


  1. label๋ฅผ ์ฝ”๋“œ๋กœ ์ถ”๊ฐ€

  2. Button ์„ StoryBoard์— ์ถ”๊ฐ€ ๋ฐ ์—ฐ๊ฒฐ


1. label๋ฅผ ์ฝ”๋“œ๋กœ ์ถ”๊ฐ€

// ViewDidLoad
// label ์ƒ์„ฑ
let label = UILabel()
// ๊ธฐ๋ณธ ์…‹ํŒ…
label.frame.size = CGSize(width: 100, height: 50)
label.text = "Hello, world"
label.textColor = .black
label.center = self.view.center

// ํƒœ๊ทธ ์ง€์ •
label.tag = 1 // ์ค‘์š” **

// ํ™”๋ฉด์— ์ถ”๊ฐ€
self.view.addSubview(label)

์—ฌ๊ธฐ์„œ ๊ฐ€์žฅ ์ค‘์š”ํ•œ๊ฑด Tag๋ฅผ ๋‹ฌ์•„์ฃผ๋Š”๊ฒƒ!

๊ทธ๋Ÿผ ์ด๋ฏธ์ง€๋Š” ์•„๋ž˜์™€ ๊ฐ™๋‹ค.



2. Button ์„ StoryBoard์— ์ถ”๊ฐ€ ๋ฐ ์—ฐ๊ฒฐ


๋ฒ„ํŠผ ์ƒ์„ฑ์€ ๊ฐ„๋‹จํ•˜๋‹ˆ ์ฝ”๋“œ๋ถ€ํ„ฐ ๋ณด์ด์ž๋ฉด

@IBAction func changeText(_ sender: UIButton) {
        
        // 1.Tag๋กœ ์ง€์ •
        let label = self.view.viewWithTag(1) as! UILabel
        
        label.text = "JS Blog!"
        label.textColor = .blue
    }

Tag ์ง€์ •ํ•ด์ฃผ๋Š” ๊ณณ์ด ๊ฐ€์žฅ ์ค‘์š”ํ•˜๋‹ค!

self์˜ view๊ฐ€ ๊ฐ€์ง„ ์„œ๋ธŒ๋ทฐ๋“ค ์ค‘์—์„œ 1๋ฒˆ ํƒœ๊ทธ๋ฅผ ๊ฐ€์ง„ ๋ทฐ๋ฅผ ๊ฐ€์ง€๊ณ  ์˜จ๋‹ค.

๊ทธ๋ฆฌ๊ณ  UILabel๋กœ ๋‹ค์šด ์บ์ŠคํŒ…์„ ํ•ด์ฃผ๊ณ  ์‚ฌ์šฉํ•˜๋ฉด ๋์ด๋‹ค.

์•„์ฃผ ์‹ฌํ”Œํ•˜๋‹ค.



๊ฒฐ๊ณผ ํ™”๋ฉด




์‹คํ—˜ - ํ—ท๊ฐˆ๋ฆฌ๋Š” ๊ฐœ๋… ๋ฐ”๋กœ ์žก๊ธฐ


๋ช‡๊ฐ€์ง€ ์‹คํ—˜์„ ํ•˜์—ฌ, ํ—ท๊ฐˆ๋ฆฌ๋Š” ๊ฐœ๋…์„ ์žก์•„๋ณด์ž


Q1. ์—†๋Š” tag ๋ฒˆํ˜ธ๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด???

A1. nil๋กœ ๋ฐ˜ํ™˜ํ•œ๋‹ค.



Q2. MainView์—์„œ tag 1๋ฒˆ์„ ๊ฐ€์ง€๊ณ  ์˜ค๋ฉด ์„ฑ๊ณตํ• ๊นŒ?

โ€˜๋” ์ƒ์œ„ ๋ทฐ์—์„œ ํƒœ๊ทธ ๋ฒˆํ˜ธ ์ง€์ •ํ•˜๋ฉด ํ˜ธ์ถœ์ด ๊ฐ€๋Šฅํ• ๊นŒ?โ€™

์ด๊ฑด ๋ง๋กœํ•˜๊ธฐ ์–ด๋ ค์›Œ์„œ, ํ™”๋ คํ•˜๊ฒŒ ๊ทธ๋ ธ๋‹ค.

์ด๋Ÿฌ๋ฉด ์กฐ๊ธˆ ๋” ์ „๋‹ฌ์ด ์ž˜๋œ๊ฒƒ ๊ฐ™๋‹ค.

์‹คํ—˜์„ ์œ„ํ•ด UI๋ฅผ ๋‹ค์‹œ ์…‹ํŒ…ํ–ˆ๋‹ค.

@IBOutlet weak var mainView: UIView!
@IBOutlet weak var subView: UIView!
@IBOutlet weak var label: UILabel!

override func viewDidLoad() {
    label.tag = 1
}

mainView ์•ˆ์— subView๊ฐ€ ์žˆ๊ณ , ๊ทธ ์•ˆ์— tag:1์ธ label์ด ์žˆ๋‹ค.

์ด์ œ ํ™•์ธ ํ•˜๊ณ  ์‹ถ์€๊ฑด ์ด๊ฒƒ์ด๋‹ค.

// Tag๋กœ ์ง€์ •
let label = mainView.viewWithTag(1) as! UILabel

label.text = "JS Blog!"

subView์˜ ์žˆ๋Š” label์˜ ํƒœ๊ทธ ๋ฒˆํ˜ธ๋ฅผ ๋” ์ƒ์œ„๋ทฐ์ธ mainView์—์„œ ์‚ฌ์šฉ์ด ๋ ๊นŒ?

Q1์— ๋”ฐ๋ฅด๋ฉด, 1 ํƒœ๊ทธ๋ฅผ ๊ฐ€์ง„ ์˜ค๋ธŒ์ ํŠธ๊ฐ€ ์—†์œผ๋ฉด nil์„ ๋ฐ˜ํ™˜ํ–ˆ๋‹ค. ๊ทธ๋ ‡๋‹ด ์ด ๊ฒฝ์šฐ์—”? ๊ฒฐ๊ณผ๋ฅผ ๋ณด์ž


์•„์ฃผ ํฅ๋ฏธ๋กœ์šด ๊ฒฐ๊ณผ๊ฐ€ ๋‚˜์™”๋‹ค. nil์ด ์•„๋‹ˆ๋‹ค ์„ฑ๊ณต ํ–ˆ๋‹ค.

๊ธ€ ์“ฐ๊ธฐ ์œ„ํ•ด ํ…Œ์ŠคํŠธ๋ฅผ ํ•˜๋ฉฐ, ์ด๊ฑด nil์ผ๊ฑฐ๋‹ค ๋ผ๊ณ  ํ™•์‹ ์— ๊ฐ€๋“์ฐฌ ์˜ˆ์ƒ์„ ํ–ˆ๋‹ค.

๊ทธ๋Ÿฐ๋ฐ;;;; ์•„๋‹ˆ๋„ค?? ์ถฉ๊ฒฉ์ ์ด๋‹ค.


Q2. MainView์—์„œ tag 1๋ฒˆ์„ ๊ฐ€์ง€๊ณ  ์˜ค๋ฉด ์„ฑ๊ณตํ• ๊นŒ?

A2. ์„ฑ๊ณตํ•œ๋‹ค.




Q3. ๊ฐ™์€ Tag๊ฐ’๋“ค์ด ์—ฌ๋Ÿฌ๊ฐœ๋ฉด?


๋งŒ์•ฝ, 1์˜ ํƒœ๊ทธ ๋ฒˆํ˜ธ๋ฅผ ๊ฐ€์ง„๊ฒƒ์ด ์—ฌ๋Ÿฌ๊ฐœ์ผ ๊ฒฝ์šฐ

โ€œ์˜ค๋ฅ˜๊ฐ€ ๋‚ ๊นŒ?, ์•ˆ๋‚œ๋‹ค๋ฉด ๋จผ์ € tag๋ฅผ ์ž…๋ ฅํ•œ ๊ฐ์ฒด๊ฐ€ ์„ ํƒ๋ ๊นŒ?, ์•„๋‹˜ ๋ฐ˜๋Œ€๋กœ ๋‚˜์ค‘์— ์ž…๋ ฅ๋œ ๊ฐ์ฒด๊ฐ€?โ€

label ์„ 2๊ฐœ ๋งŒ๋“ค์–ด์„œ, ๋ˆ„๊ฐ€ ๋˜๋Š”์ง€ ๋จผ์ € ๋ณด์ž,

// ํƒœ๊ทธ ์ง€์ •
label1.tag = 1
label2.tag = 1

// ํ™”๋ฉด ์ถ”๊ฐ€
self.view.addSubview(label1)
self.view.addSubview(label2)
// ๋ฒ„ํŠผ ์•ก์…˜
let label = self.view.viewWithTag(1) as! UILabel        
label.text = "JS Blog!"
label.sizeToFit()


label ๋งŒ๋“œ๋Š”๊ฑด ์ƒ๋žตํ•˜๊ณ  ์ค‘์š” ๋ถ€๋ถ„๋งŒ ๊ฐ€์ง€๊ณ  ์™”๋‹ค.

๊ทธ๋Ÿผ ๊ฒฐ๊ณผ๋ฅผ ๋ณด์ž


์˜ˆ์ƒ๋Œ€๋กœ ๋จผ์ € ์ง€์ •ํ•œ๊ฒŒ ๋ณ€ํ–ˆ๋‹ค.

๊ทธ๋Ÿผ ๋‹น์—ฐํžˆ ์ง€์ • ์ˆœ์„œ๋ฅผ ๋ฐ”๊พธ๋ฉด 2๊ฐ€ ๋ณ€ํ•˜๊ฒ ์ง€?

// ํƒœ๊ทธ ์ง€์ • (์ˆœ์„œ ๋ฐ”๋€œ)
label2.tag = 1
label1.tag = 1


// ํ™”๋ฉด ์ถ”๊ฐ€
self.view.addSubview(label1)
self.view.addSubview(label2)



?

???

??????????

????????????

์•„๋‹ˆ๋‹คโ€ฆ ์ง€์ • ์ˆœ์„œ๊ฐ€ ์ค‘์š”ํ•œ๊ฒƒ์ดโ€ฆ.

๊ทธ๋Ÿผ ์ถ”๊ฐ€ํ• ๋•Œ์ธ๊ฐ€?


// ํƒœ๊ทธ ์ง€์ •
label1.tag = 1
label2.tag = 1


// ํ™”๋ฉด ์ถ”๊ฐ€ (์ˆœ์„œ ๋ฐ”๋€œ)
self.view.addSubview(label2)
self.view.addSubview(label1)


์˜คโ€ฆ ํ˜ธโ€ฆ. ์ด๊ฒƒ๋„ ์ •๋ง ์˜ˆ์ƒ ๋ชปํ–ˆ๋‹ค.

**์ง€์ • ์‹œ์ ๋ณด๋‹ค ์ค‘์š”ํ•œ๊ฑด ์ถ”๊ฐ€ํ•œ ์‹œ์ ์ด๋‹ค.**

๊ทธ๋ ‡๋‹ด, ํƒœ๊ทธ ์ง€์ •์„ ๋‚˜์ค‘์— ํ•ด์ฃผ๋ฉด ๋‹ค๋ฅผ๊นŒ?


// ํ™”๋ฉด ์ถ”๊ฐ€
self.view.addSubview(label1)
self.view.addSubview(label2)


// ํƒœ๊ทธ ์ง€์ •
label2.tag = 1
label1.tag = 1


๊ทธ๋Œ€๋กœ๋‹ค

์ด๋กœ์จ

์ง€์ • ์‹œ์  < ํ™”๋ฉด ์ถ”๊ฐ€ ์‹œ์ 

์ด๋ผ๋Š”๊ฒƒ์ด ํ™•์ธ ๋˜์—ˆ๋‹ค.


๊ทธ๋ ‡๋‹ด

// ํƒœ๊ทธ ์ง€์ •
label2.tag = 1

// ํ™”๋ฉด ์ถ”๊ฐ€
self.view.addSubview(label1)
self.view.addSubview(label2)


์ด ์ƒํƒœ์—์„œ ๋ฒ„ํŠผ ์„ ํƒ์‹œ label1์˜ ํƒœ๊ทธ๋ฅผ ์ง€์ •ํ•œ๋‹ค๋ฉด???

( ํ•ด๋‹น ํƒœ๊ทธ๋ฒˆํ˜ธ๊ฐ€ ์‚ฌ์šฉ๋œ ํ›„์—๋„ โ€˜์ง€์ •์‹œ์  < ํ™”๋ฉด ์ถ”๊ฐ€โ€™ ์‹œ์  ์ธ์ง€ ํ™•์ธ์„ ์œ„ํ•จ)

์ด๋ฒˆ์—” ์กฐ๊ธˆ ๋ฐฉ์‹์ด ๋ฐ”๋€Œ์–ด์•ผ ํ•œ๋‹ค.

label ๋‘๊ฐœ๋ฅผ viewDidLoad์•ˆ์—์„œ ๋ง๊ณ  ํด๋ž˜์Šค ๋‚ด๋ถ€์— ์„ ์–ธํ•ด์ค€๋‹ค.


์ด๋ ‡๊ฒŒ!

let label1 = UILabel()
let label2 = UILabel()
    
override func viewDidLoad() { ... }

๊ทธ๋ฆฌ๊ณ  ๋ฒ„ํŠผ ์•ก์…˜์ชฝ์—”

// Tag๋กœ ์ง€์ •
let label = self.view.viewWithTag(1) as! UILabel

label.text = "JS Blog!"
label.sizeToFit()

// ๋จผ์ € ํ™”๋ฉด์— ์ถ”๊ฐ€๋œ label1์— ํƒœ๊ทธ ์ง€์ •
label1.tag = 1 


์‚ฌ์šฉ์ด ๋˜๊ฑด ๋ง๊ฑด ์ƒ๊ด€์ด์—†์—ˆ๋‹ค. ์˜ค์ง ์ค‘์š”ํ•œ๊ฑด

โ€˜Tag ์šฐ์„  ์ˆœ์œ„: ์ง€์ • ์‹œ์  < ํ™”๋ฉด ์ถ”๊ฐ€ ์‹œ์ โ€™

Q3. ๊ฐ™์€ Tag๊ฐ’๋“ค์ด ์—ฌ๋Ÿฌ๊ฐœ๋ฉด?

A3. Tag ์…‹ํŒ… ์‹œ์ ๋ณด๋‹ค, ๋จผ์ € ํ™”๋ฉด ์ถ”๊ฐ€๋œ ์˜ค๋ธŒ์ ํŠธ๊ฐ€ ๊ฐ‘์ด๋‹ค.




Q4. Q2 VS Q3


๊ทธ๋ ‡๋‹ด ๋‚˜์—๊ฒŒ ์ถฉ๊ฒฉ์„ ์คฌ๋˜ Q2์™€

โ€˜Q2. MainView์—์„œ tag 1๋ฒˆ์„ ๊ฐ€์ง€๊ณ  ์˜ค๋ฉด ์„ฑ๊ณตํ• ๊นŒ?โ€™

Q3์„ ์„ž์–ด์„œ ์‹คํ—˜ ํ•ด๋ณด์ž


override func viewDidLoad() {
    label1.tag = 1
	label.tag = 1 // subView์˜ Label
}

์šฐ์„ , ์ด ์‹คํ—˜์— ์ง€์ผœ๋ด์•ผํ• ์ ์€

label์˜ ๊ฒฝ์šฐ, self.view์— ์ถ”๊ฐ€๋œ ๊ฐ์ฒด๊ฐ€ ์•„๋‹ˆ๋‹ค.

self.view์— ์ถ”๊ฐ€๋œ mainView์˜ ์ถ”๊ฐ€๋œ subView์— ์ถ”๊ฐ€๋œ label์ด๋‹ค.

ํ˜น์‹œ ๊ทธ๋Ÿฐ ๊ณ„์ธต์ด๋ผ๋ฉด, ์šฐ์„ ์ˆœ์œ„๊ฐ€ ๋ฐ”๋€Œ์ง€ ์•Š์„๊นŒ? ๋ผ๋Š” ํ˜น์‹œ๋‚˜๋ž€ ์ƒ๊ฐ์—์˜€๋‹ค.

label1์˜ ๊ฒฝ์šฐ ์ฝ”๋“œ๋กœ ์ถ”๊ฐ€๋œ ์˜ค๋ธŒ์ ํŠธ

label์˜ ๊ฒฝ์šฐ StoryBoard์— ์ถ”๊ฐ€๋œ ์˜ค๋ธŒ์ ํŠธ ์ž„์„ ์ƒ๊ฐํ•˜๊ณ  ์˜ˆ์ƒํ•ด๋ณด์ž.


โ€˜A3. Tag ์…‹ํŒ… ์‹œ์ ๋ณด๋‹ค, ๋จผ์ € ํ™”๋ฉด ์ถ”๊ฐ€๋œ ์˜ค๋ธŒ์ ํŠธ๊ฐ€ ๊ฐ‘์ด๋‹ค.โ€™ ๋Š” ๋ณ€ํ™”๊ฐ€ ์—†์—ˆ๋‹ค.

์ผ๊ด€์„ฑ ์žˆ์–ด์„œ ์ข‹๋‹ค!

์Šคํ† ๋ฆฌ๋ณด๋“œ์˜ ๊ฒฝ์šฐ ViewDidLoad ๋ณด๋‹ค๋„ ์ด์ „์— ๊ทธ๋ ค์ง€๊ธฐ ๋•Œ๋ฌธ์—,

label์ด ๋”๋นจ๋ฆฌ ์ถ”๊ฐ€ ๋˜์—ˆ๋‹ค.

(์ •ํ™•ํ•œ ์‹œ์  ๊ณต๋ถ€ํ• ๊ฒธ ๋” ์•Œ์•„๋ด์•ผ๊ฒ ๋‹ค.)



๋งˆ๋ฌด๋ฆฌ



๊ฐ€์žฅ ์ค‘์š”ํ•œ๊ฒƒ์€

๊ฐ์ฒด๊ฐ€ ์ถ”๊ฐ€๋œ ์‹œ์ ์ด ์ค‘์š”ํ•˜๋‹ค๋Š” ๊ฒƒ์ด์—ˆ๋‹ค.

๋ถ€๊ฐ€์ ์œผ๋กœ ํ—ท๊ฐˆ๋ ธ๋˜ tag๋Š” ์–ด๋Š ๋ฒ”์œ„๊นŒ์ง€ ๋ ๊ฒƒ์ธ๊ฐ€ (Q2)๋„ ์•Œ๊ฒŒ๋˜์—ˆ๋‹ค.

๊ทธ๋ž˜๋„ ์—ฌ๋Ÿฌ ์‹œ๋„ ํ†ตํ•ด์„œ ์ด์ œ ๊ฐ์ด ์™”๋‹ค ์‹ถ์–ด์„œ ๋ธ”๋กœ๊ทธ์— ์ ์€๊ฒƒ์ด์—ˆ๋Š”๋ฐ,

์‹คํ—˜์ค‘ ์˜ˆ์ƒ์ด ํ‹€๋ฆฐ๊ฒŒ ๋‚˜์™€์„œ ๋‹นํ™ฉ์Šค๋Ÿฌ์› ๋‹ค.

๋‹นํ™ฉ์Šค๋Ÿฌ์› ๋˜ ๋งŒํผ! ๋‹ค์Œ์— ์‚ฌ์šฉํ• ๋• ์ข€๋” ์ž˜ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ ๊ฐ™๋‹ค.


๋!