๊ณต๋ถํ ๋ด์ฉ์ ์ ๋ฆฌํ ๊ธ์ ๋๋ค.
๋ฌธ์
์ปดํฌ๋ํธ๊ฐ ๋ ๊ฐ์ธ ํผ์ปค ๋ทฐ๋ฅผ ๊ตฌํํ๋ผ. ์ผ์ชฝ ํผ์ปค ๋ทฐ๋ฅผ ์ ํํ์ ๊ฒฝ์ฐ ํ์ผ ๋ช ์ด ๋ํ๋๋๋ก, ์ค๋ฅธ์ชฝ ํผ์ปค ๋ทฐ๋ฅผ ์ ํํ์ ๊ฒฝ์ฐ ์ด๋ฏธ์ง ๋ทฐ์ ์ด๋ฏธ์ง๋ฅผ ์ถ๋ ฅํ๋๋ก ํ๋ค.
๊ตฌํ ์์
- ๋ ์ด์์ ์์ฑํ๊ธฐ
- ์์ธ๋ ๋ณ์ ์์ฑํ๊ธฐ
- ํผ์ปค ๋ทฐ์ ๋ธ๋ฆฌ๊ฒ์ดํธ ์ค์ ํ๊ธฐ
- ํ์ํ ํด๋์ค ์์๋ฐ๊ธฐ(ํ๋กํ ์ฝ ์ฑํ), ๋ณ์ ๋ฐ ์์ ์ถ๊ฐํ๊ธฐ, ์ด๊ธฐํ๋ฉด ์ค์ ํ๊ธฐ
- ํผ์ปค ๋ทฐ ๋์ ์ฝ๋ ์์ฑํ๊ธฐ
- ์ฒซ ๋ฒ์งธ ํผ์ปค ๋ทฐ ์ ํ ์ ํ์ผ ๋ช ์ถ๋ ฅํ๊ธฐ
- ๋ ๋ฒ์งธ ํผ์ปค ๋ทฐ ์ ํ์ ์ด๋ฏธ์ง ์ถ๋ ฅํ๊ธฐ
- ํผ์ปค ๋ทฐ ๋ฃฐ๋ ํ ๋์ด ์ค์
์ต์ข ๊ฒฐ๊ณผ
โป ๊ฐ๋ ์ดํด๋ณด๊ธฐ
ํ๋กํ ์ฝ Protocol
๋ธ๋ฆฌ๊ฒ์ดํธ๋ ํ๋กํ ์ฝ๋ก ๊ตฌํ๋์ด์๋ค. ๋ฐ๋ผ์ ํ๋กํ ์ฝ์ ๋จผ์ ์์๋ณด์.
Protocol
(1) ์ธ๊ต ์๋ก, ์์
(2) (์กฐ์ฝ์) ์ด์, ๋ณด์ถฉํ์ฝ
(3) ์ปดํจํฐ ํต์ ๊ท์ฝ
(4) (๊ณผํ ์คํ, ์๋ฃ ์น๋ฃ์) ๊ณํ์
- ํน์ ์ญํ ์ ํ๊ธฐ ์ํ ๋ฉ์๋, ํ๋กํผํฐ, ๊ธฐํ ์๊ตฌ์ฌํญ ๋ฑ์ ์ฒญ์ฌ์ง์ ์ ์ํ๋ค.
- ํ๋กํ ์ฝ์ ์ ์๋ฅผ ํ๊ณ ์ ์๋ฅผ ํ ๋ฟ ์ค์ค๋ก ๊ธฐ๋ฅ์ ๊ตฌํํ์ง ์๋๋ค. ๊ธฐ๋ฅ์ ๊ตฌํ์ ํด๋น ํ๋กํ ์ฝ์ ์ฑํ(Adopted)ํ ๊ณณ์์ ์ด๋ฃจ์ด์ง๋ค.
- ํ๋กํ ์ฝ์ ๋ค๋ฅธ ๊ฐ์ฒด๋ฅผ ๋์ธ ๋ฉ์๋์ ์์ฑ์ด ์ ์๋์ด์๋ค. ์ฆ ์ฐ๋ฆฌ๋ ์ฑํํ ํ๋กํ ์ฝ์์ ์ํ๋ ๊ธฐ๋ฅ๋ง์ ๊ฐ์ ธ์ ์ฌ์ฉํ ์ ์๋ค.
- ์๋ฐ์ interface์ ์ ์ฌํ๋ค.
๋ธ๋ฆฌ๊ฒ์ดํธ Delegate
delegate
1. (์ง๋จ์ ์์ฌ๋ฅผ ๋ํํ๋) ๋ํ(์)
2. (๊ถํ, ์ ๋ฌด ๋ฑ์) ์์ํ๋ค
3. (๋ํ๋ฅผ) ๋ฝ๋ค
- ๋๋ฆฌ์. ๋๊ตฐ๊ฐ ํด์ผ ํ ์ผ์ ๋์ ํด์ฃผ๋ ์ญํ
- delegate๋ ํ๋กํ ์ฝ๋ก ๊ตฌํ๋์ด์๋ค.
- '์์ํ๋ค'๋ผ๋ ์๋ฏธ๋ฅผ ๊ฐ์ง ๊ฒ์ฒ๋ผ, A๊ฐ ํด์ผํ โ ์, B๊ฐ ๊ถํ์ ์์๋ฐ์ โ ์ ์ํํ๋ค.
- ํด๋์ค ์ ์ธ๋ฌธ ์ค๋ฅธ์ชฝ์ ์ฑํํ ํ๋กํ ์ฝ์ ์ ๋๋ค. (์์๋ฐ์ ํด๋์ค๋ฅผ ๋จผ์ ์ ์ ํ ์ฑํํ ํ๋กํ ์ฝ์ ๋์ดํ๋ค.)
class ํด๋์ค๋ช
: ์์๋ฐ์ ํด๋์ค๋ช
, ์ฑํํ ํ๋กํ ์ฝ {
...
}
- ์ฌ์ฉ์๊ฐ ๊ฐ์ฒด๋ฅผ ํฐ์นํ์ ๋ ํด์ผ ํ ์ผ์ ๋ธ๋ฆฌ๊ฒ์ดํธ ๋ฉ์๋์ ๊ตฌํํ๊ณ , ํด๋น ๊ฐ์ฒด๊ฐ ํฐ์น๋์์ ๋ ๋ธ๋ฆฌ๊ฒ์ดํธ๊ฐ ํธ์ถ๋์ด ์์๋ฐ์ ์ผ์ ํ๊ฒ ๋๋ค.
- ์ก์ ํจ์๋ฅผ ์ฌ์ฉํด ๊ธฐ๋ฅ์ ๊ตฌํํ ์๋ ์์ง๋ง, ํ๋กํ ์ฝ์ ์ฑํํ์ฌ ๋ธ๋ฆฌ๊ฒ์ดํธ ๋ฉ์๋๋ฅผ ์ฌ์ฉํ๋ฉด ํ๋กํ ์ฝ์ ์ ์๋์ด์๋ ๋ง๊ณ ๋ค์ํ ๊ธฐ๋ฅ๋ค์ ์ฌ์ฉํ ์ ์์ด ์ ์ฉํ๋ค.
1. ๋ ์ด์์ ์์ฑํ๊ธฐ
2. ์์ธ๋ ๋ณ์ ์์ฑํ๊ธฐ
import UIKit
class PickerViewMissionController: UIViewController {
@IBOutlet var pickerImage: UIPickerView!
@IBOutlet var lblImageFileName: UILabel!
@IBOutlet var imageView: UIImageView!
}
3. ํผ์ปค ๋ทฐ์ ๋ธ๋ฆฌ๊ฒ์ดํธ ์ค์ ํ๊ธฐ
๋ง์ฐ์ค์ ์ค๋ฅธ์ชฝ ๋ฒํผ์ผ๋ก ํผ์ปค ๋ทฐ๋ฅผ ์ ํํ ํ ์์ชฝ์ ๋ทฐ ์ปจ๋๋กค๋ฌ ์์ด์ฝ ์๋ก ๋์ด๋ค ๋๋๋ค.
๊ทธ ํ delegate๋ฅผ ํด๋ฆญํ์ฌ ํผ์ปค ๋ทฐ์ ๋ธ๋ฆฌ๊ฒ์ดํธ๋ฅผ ์ค์ ํ๋ค.
4. ํ์ํ ํด๋์ค ์์๋ฐ๊ธฐ(ํ๋กํ ์ฝ ์ฑํ), ๋ณ์ ๋ฐ ์์ ์ถ๊ฐํ๊ธฐ, ์ด๊ธฐํ๋ฉด ์ค์ ํ๊ธฐ
4.1 UIPickerViewDelegate, UIPickerViewDataSource ํ๋กํ ์ฝ ์ฑํํ๊ธฐ
import UIKit
class PickerViewMissionController: UIViewController,
UIPickerViewDelegate,
UIPickerViewDataSource {
...
}
UIPickerViewDelegate
The delegate of a UIPickerView object must adopt this protocol and implement at least some of its methods to provide the picker view with the data it needs to construct itself.
The delegate implements the required methods of this protocol /to return height, width, row title, and the view content for the rows in each component. It must also provide/ the content for each component’s row, /either as a string or a view. Typically the delegate implements /other optional methods/ to respond to new selections or deselections of component rows.
UIPickerView ๊ฐ์ฒด์ ๋ธ๋ฆฌ๊ฒ์ดํธ๋ UIPickerViewDelegate ํ๋กํ ์ฝ์ ์ฑํํด์ผํ๋ค, ๊ทธ๋ฆฌ๊ณ ํผ์ปค ๋ทฐ ๊ตฌ์ฑ์ ํ์ํ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ถ๊ธฐ ์ํด ๋ช ๊ฐ์ ํ์ ๋ฉ์๋๋ฅผ ๊ตฌํํด์ผ ํ๋ค.
๋ธ๋ฆฌ๊ฒ์ดํธ๋ ๋์ด, ๋๋น, ํ(์์) ํ์ดํ ๊ทธ๋ฆฌ๊ณ ๊ฐ ์ปดํฌ๋ํธ์ ํ(์์)์ ์ํ ๋ทฐ ์ฝํ ์ธ ๋ฅผ ๋ฐํํ๊ธฐ ์ํด UIPickerViewDelegate ํ๋กํ ์ฝ์ด ํ์๋ก ํ๋ ๋ฉ์๋๋ฅผ ๊ตฌํํด์ผ ํ๋ค. ๋ํ ๋ธ๋ฆฌ๊ฒ์ดํธ๋ ๋ฌธ์์ด ๋๋ ๋ทฐ๋ฅผ ์ด์ฉํด ๊ฐ ์ปดํฌ๋ํธ ํ(์์)์ ์ฝํ ์ธ ๋ฅผ ์ ๊ณตํด์ผ ํ๋ค. ์ผ๋ฐ์ ์ผ๋ก ๋ธ๋ฆฌ๊ฒ์ดํธ๋ ์ปดํฌ๋ํธ ํ(์์)์ ์๋ก์ด ์ ํ ๋๋ ์ ํ ์ทจ์์ ์๋ตํ๊ธฐ ์ํด ๊ธฐํ ์ ํ ๋ฉ์๋๋ฅผ ๊ตฌํํด์ผ ํ๋ค.
UIPickerViewDataSource
The UIPickerViewDataSource protocol must be adopted by an object that mediates between a UIPickerView object and your application’s data model for that picker view. The data source provides the picker view with the number of components, and the number of rows in each component, for displaying the picker view data. Both methods in this protocol are required.
UIPickerView ๊ฐ์ฒด์ pickerView๋ฅผ ์ํ ์ ํ๋ฆฌ์ผ์ด์ ๋ฐ์ดํฐ ๋ชจ๋ธ ์ฌ์ด์ ์ค์ฌํ๋ ๊ฐ์ฒด๋ UIPickerViewDelegate ํ๋กํ ์ฝ์ ์ฑํํด์ผ ํ๋ค.
๋ฐ์ดํฐ ์์ค๋ pickerView์ ๋ฐ์ดํฐ๋ฅผ ์ถ๋ ฅํ๊ธฐ ์ํด pickerView์ ์ปดํฌ๋ํธ ์, ๊ฐ ์ปดํฌ๋ํธ์ ํ(์์)์ ์๋ฅผ ์ ๊ณตํ๋ค. ์ด ํ๋กํ ์ฝ์์ ๋ ๋ฉ์๋๋ ํ์์ด๋ค.
4.2 ๋ณ์ ๋ฐ ์์ ์ถ๊ฐํ๊ธฐ, ์ด๊ธฐํ๋ฉด ์ค์ ํ๊ธฐ
import UIKit
class PickerViewMissionController: UIViewController,
UIPickerViewDelegate,
UIPickerViewDataSource {
let MAX_ARRAY_NUM = 3
let PICKER_VIEW_COLUMN = 2 //ํผ์ปค ๋ทฐ component 2๊ฐ ํ์
var imageArray: Array<UIImage?> = [UIImage?]() //์ด๋ฏธ์ง๋ฅผ ์ ์ฅํ ๋ฐฐ์ด
var imageFileName = ["putArmsAround.jpg",
"playingMusic.jpg",
"face.png"] //์ด๋ฏธ์ง ํ์ผ ์ด๋ฆ์ ์ ์ฅํ ๋ฐฐ์ด
@IBOutlet var pickerImage: UIPickerView!
@IBOutlet var lblImageFileName: UILabel!
@IBOutlet var imageView: UIImageView!
//๋ทฐ ๋ก๋์ ํธ์ถ๋๋ ํจ์
override func viewDidLoad() {
super.viewDidLoad()
//UIImage ํ์
์ imageArray์ ์์ ์ถ๊ฐ
for i in 0 ..< MAX_ARRAY_NUM {
let image = UIImage(named: "WallaceAndGromit_\(imageFileName[i])")
imageArray.append(image)
}
//์ด๊ธฐ ํ๋ฉด ์ค์
lblImageFileName.text = imageFileName[0]
imageView.image = imageArray[0]
}
}
5. ํผ์ปค ๋ทฐ ๋์์ฝ๋ ์์ฑํ๊ธฐ
+ component๋ ์ธ๋ฐ์ค 0๋ถํฐ ์์ํ๋ค. ์ธ์์ธ component๋ฅผ ์ฌ์ฉํด component๋ฅผ ๊ตฌ๋ถํ ์ ์๋ค.
- numberOfComponent : ํผ์ปค ๋ทฐ์ ํ์๋๋ ์ด ๊ฐ์, ์ฆ ํผ์ปค ๋ทฐ ์ปดํฌ๋ํธ์ ์๋ฅผ ํผ์ปค ๋ทฐ์๊ฒ ์ ๋ฌํ๋ ๋ธ๋ฆฌ๊ฒ์ดํธ ๋ฉ์๋
//returns the number of components(columns) to display
//ํ๋ฉด์ ๋ณด์ฌ์ค component ๊ฐ์(์ด)๋ฅผ ๋ฐํํ๋ค.(ํผ์ปค ๋ทฐ์ component ๊ฐ์(์ด)๋ฅผ ์ ํด์ฃผ๋ ๊ณณ)
func numberOfComponents(in pickerView: UIPickerView) -> Int {
return PICKER_VIEW_COLUMN
}
- numberOfRowsInComponent ์ธ์๋ฅผ ๊ฐ์ง๋ pickerView : ๊ฐ ์ปดํฌ๋ํธ์ ํ(์์)์ ๊ฐ์๋ฅผ ํผ์ปค ๋ทฐ์ ์ ๋ฌํ๋ ๋ธ๋ฆฌ๊ฒ์ดํธ ๋ฉ์๋
//Returns The number of rows for the component.
//numberOfRowsInComponent์ธ์๋ฅผ ๊ฐ์ง ๋ธ๋ฆฌ๊ฒ์ดํธ ๋ฉ์๋
//ํ component์ ํ์ ๊ฐ์๋ฅผ ๋ฐํํ๋ค
//component๋ ์ธ๋ฐ์ค 0๋ถํฐ ์์ํ๋ค. ์ธ์์ธ component๋ฅผ ์ฌ์ฉํด component๋ฅผ ๊ตฌ๋ถํ ์ ์๋ค.
func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
return imageFileName.count
}
- titleForRow ์ธ์๋ฅผ ๊ฐ์ง๋ pickerView : ๊ฐ ์ปดํฌ๋ํธ์ ํ ํ์ดํ์ ํผ์ปค ๋ทฐ์ ๋ฌธ์์ด ๊ฐ์ผ๋ก ์ ๋ฌํ๋ ๋ธ๋ฆฌ๊ฒ์ดํธ ๋ฉ์๋
//์ด๋ฒ ํ๋ก์ ํธ์๋ ์ฌ์ฉํ์ง ์์ ๋ฉ์๋
func pickerView(_ pickerView: UIPickerView,
titleForRow row: Int, forComponent componenet) -> String? {
return imageFileName[row] //์ด๋ค ํ(์์)์ ํด๋นํ๋ ๋ฐฐ์ด ์์๋ฅผ ๋ฐํํ๋ค.
}
- viewForRow ์ธ์๋ฅผ ๊ฐ์ง๋ pickerView : ๊ฐ ์ปดํฌ๋ํธ์ ํ(์์)์ ๋ฐ view๋ฅผ ํผ์ปค ๋ทฐ์ UIView ๊ฐ์ผ๋ก ์ ๋ฌํ๋ ๋ธ๋ฆฌ๊ฒ์ดํธ ๋ฉ์๋
//viewForRow ์ธ์๊ฐ ์๋ ๋ธ๋ฆฌ๊ฒ์ดํธ ๋ฉ์๋๋ component์ UIView๊ฐ ๋จ๋๋ก ํ๋ค. - ์ด๋ฏธ์ง๋ฅผ ๋จ๊ฒ ํ ์ ์๋ค.
func pickerView(_ pickerView: UIPickerView, viewForRow row: Int,forComponent component: Int, reusing view: UIView?) -> UIView {
let imageView = UIImageView(image: imageArray[row])
imageView.frame = CGRect(x: 0, y : 0, width: 150, height: 100)
return imageView
}
6 & 7 . ์ฒซ ๋ฒ์งธ ํผ์ปค ๋ทฐ ์ ํ ์ ํ์ผ ๋ช ์ถ๋ ฅํ๊ธฐ &๋ ๋ฒ์งธ ํผ์ปค ๋ทฐ ์ ํ ์ ์ด๋ฏธ์ง ์ถ๋ ฅํ๊ธฐ
+ component๋ ์ธ๋ฐ์ค 0๋ถํฐ ์์ํ๋ค. ์ธ์์ธ component๋ฅผ ์ฌ์ฉํด component๋ฅผ ๊ตฌ๋ถํ ์ ์๋ค.
- didSelectRow ์ธ์๋ฅผ ๊ฐ์ง๋ pickerView : ์ฌ์ฉ์๊ฐ ์ปดํฌ๋ํธ์ ํ์ ์ ํํ์ ๋ ํธ์ถ๋๋ ๋ธ๋ฆฌ๊ฒ์ดํธ ๋ฉ์๋
//์ฌ์ฉ์๊ฐ ํผ์ปค ๋ทฐ์ ํ์ ์ ํํ์ ๋ ํ ์ผ์ ๋ธ๋ฆฌ๊ฒ์ดํธ์๊ฒ ์ง์ํ๋ ๋ฉ์๋
//didSelectRow ์ธ์๊ฐ ์๋ ๋ฉ์๋
func pickerView(_ pickerView: UIPickerView,
didSelectRow row: Int, inComponent component: Int) {
//์ผ์ชฝ ์ปดํฌ๋ํธ๋ฅผ ์ ํํ์ ๋ ํ์ผ ๋ช
์ถ๋ ฅ, ์ค๋ฅธ์ชฝ ์ปดํฌ๋ํธ ์ ํํ์ ๋ ํ์ผ ๋ช
์ถ๋ ฅ
if component == 0 {
lblImageFileName.text = imageFileName[row]
}
else{
imageView.image = imageArray[row]
}
}
8. ํผ์ปค ๋ทฐ ๋ฃฐ๋ ํ ๋์ด ์ค์
- rowHeightForComponent ์ธ์๋ฅผ ๊ฐ์ง๋ pickerView : ๊ฐ ์ปดํฌ๋ํธ์ ํ(์์) ๋์ด๋ฅผ ํผ์ปค ๋ทฐ์ ์ ๋ฌํ๋ ๋ธ๋ฆฌ๊ฒ์ดํธ ๋ฉ์๋
//returns height of row for each component.
//component ํ์ ๋์ด๋ฅผ ์ ํ ์ ์๋ค.
//rowHeightForComponent ์ธ์๋ฅผ ๊ฐ์ง๋ ๋ฉ์๋
func pickerView(_ pickerView: UIPickerView, rowHeightForComponent component:Int) -> CGFloat {
return PICKER_VIEW_HEIGHT
}
๊ณต๋ถํ ์๋ฃ
https://zeddios.tistory.com/8
https://blog.naver.com/seotaji/220293615979
<๋ธ๋ฆฌ๊ฒ์ดํธ>
์ผ๊ณฐ - ์ค์ํํธ ํ๋ก๊ทธ๋๋ฐ 5ํ (SWIFT5)
https://blog.naver.com/seotaji/220287208861
<ํ๋กํ ์ฝ>
Do It! ์ค์ํํธ๋ก ์์ดํฐ ์ฑ ๋ง๋ค๊ธฐ ๊ฐ์ 5ํ
SWIFT ๋ฌธ์