๊ณ ์๋ฃ
- ๊ผผ๊ผผํ ์ฌ์์จ์ Swift ๊ธฐ๋ณธํธ, ์ค์ ํธ
- https://zeddios.tistory.com/
์์ธํ
- xcode 11๋ฒ์ ์์ ์ด๋ฅธ๋ฐ SWIFT UI๋ ์ด๋ฆ์ผ๋ก ์๋ก์ด ๋ฐฉ์์ ๋์์ธ ์ธํฐํ์ด์ค๋ฅผ ์ ๊ณตํ๋ค. ์ ํ์ ์ค๋ซ๋์ ์คํ ๋ฆฌ๋ณด๋ ํน์ ํ๋ก๊ทธ๋๋ฐ์ ์ผ๋ก ์งค ์ ์๋ UI ๋ฐฉ๋ฒ ๋ ๊ฐ์ง๋ฅผ ์ ๊ณตํ๋ค. SWIFT UI๋ ์ด ๋ฐฉ์์ ํํผํ์ฌ, ๋๋ ์ง๋(์ชผ๊ฐ์ง๋) ํ๋ฉด ๊ฒฝํ์ ์ ๊ณตํ๋ค.
-
์ด๋ป๊ฒ ๋ ์ด์์์ด ๋ณด์ด๊ณ ์๋ํ๋์ง์ ๋ํ ์๋ก์ด UI
-
์ค์๊ฐ์ผ๋ก Swift ์ฝ๋ ์์ฑ์ UI ๋ฏธ๋ฆฌ๋ณด๊ธฐ๋ฅผ ์ ๊ณตํจ
Swift UI๋ ๋ง ๊ทธ๋๋ก UI๊ด๋ จ ํ๋ ์์ํฌ๋ค. ๊ทธ๋ฌ๋ฏ๋ก ๊ธฐ์กด์ ์ฌ์ฉํ๊ณ ์๋, ๊ฐ๊ฐ์ ๋ทฐ ์ปจํธ๋กค๋ฌ ํด๋์ค์ ๊ฑฐ์ ๋ค์ด๊ฐ์๋
import UIKit์ด ๋ถ๋ถ์
import SwiftUI๋ก ๋ฐ๋๋ค๋ ๊ฒ์ ์๋ฏธํ๋ค. ๊ทธ๋ฌ๋ฏ๋ก SwiftUI๋ฅผ Importํ๊ฒ ๋ ๊ฒฝ์ฐ UI๊ฐ ์์ ๋ถ์๋ ์ ๋ค์ด ๋ค ํ๋ฝํ๊ณ ์๋กญ๊ฒ ๋ณํ๋ค.
- ์์ง์ UIkit ์ฆ ์คํ ๋ฆฌ๋ณด๋๊ฐ ๋ง์ด ์ฌ์ฉ๋๋ ์ถ์ธ์ด๋ ๊ณง SwiftUI๋ก ๋์ด๊ฐ ๊ฒ ๊ฐ๋ค.-> SwiftUI๋ก ๋ฐฐ์ฐ๋๊ฒ ๋ ๋์ ์๋ ์์. ํ์ง๋ง ์ด์ ๋ฒ์ ์ ๊ณ ์ณ์ผํ๊ธฐ ๋๋ฌธ์ ๋๋คํ๊ธฐ์๋ ๋ง์ด ํ๋ค๋ค.
์์ธํ
๋ทฐ ์ปจํธ๋กค๋ฌ์ ์๋ช ์ฃผ๊ธฐ๋ ๋ค์๊ณผ ๊ฐ์ด ๋๋ ์ ์๋ค.
- Appearing: ๋ทฐ ์ปจํธ๋กค๋ฌ๊ฐ ์คํฌ๋ฆฐ์ ๋ฑ์ฅํ๊ธฐ ์์ํ ์๊ฐ๋ถํฐ ๋ฑ์ฅ์ ์๋ฃํ๊ธฐ ์ง์ ๊น์ง์ ์ํ, ๋ค๋ฅธ ๋ทฐ ์ปจํธ๋กค๋ฌ์ ๊ต์ฐจ๋๊ธฐ๋ํจ
- Appeared : ๋ทฐ ์ปจํธ๋ก๋ด๊ฐ ์์ ํ ๋ฑ์ฅํ ์ํ
- Disappearing : ๋ทฐ ์ปจํธ๋กค๋ฌ๊ฐ ์คํฌ๋ฆฐ์์ ๊ฐ๋ ค์ง๊ธฐ ์์ํด์ ์์ ํ ๊ฐ๋ ค์ง๊ธฐ ์ง์ ์ ์ํ, ๋๋ ํด์ฅํ๊ธฐ ์์ํด์ ์์ ํ ํด์ฅํ ์ํ, ์๋ก ๋ฑ์ฅํ๋ ๋ทฐ ์ปจํธ๋กค๋ฌ์ ๊ต์ฐจ
- Disappeared : ๋ทฐ ์ปจํธ๋กค๋ฌ๊ฐ ์คํฌ๋ฆฐ์์ ์์ ํ ๊ฐ๋ ค์ก๊ฑฐ๋ ํน์ ํด์ฅํ ์ํ๋ฅผ ์๋ฏธํ๋ค.
viewWillAppear(): ํ๋ฉด์ด ๋ค์ ๋ฑ์ฅํ๊ธฐ ์์ํ์ํ(=Appearing)๋ก ๋ฐ๋๋ ๋์ ๋ทฐ ์ปจํธ๋ด๋ฌ๋ ์ฑ ๊ฐ์ฒด์ ์ํด ์ด ๋ฉ์๋๋ฅผ ํธ์ถํ๊ณ ์ฃผ๋ก
ํ๋ฉด์ด ๋ฑ์ฅํ ๋ ๋ง๋ค ๋ฐ์ดํฐ๋ฅผ ๊ฐฑ์ ํด์ฃผ๊ณ ์ถ๋ค๋ฉด ์ด ๋ฉ์๋๋ฅผ override ํด์ ์ํ๋ ์ฝ๋๋ฅผ ์์ฑํ๋ค.
ViewDidAppear- ๋ทฐ ์ปจํธ๋กค๋ฌ๊ฐ ํ๋ฉด์ ๋ํ๋ ์งํ์ ์คํ๋ฉ๋๋ค. ํ๋ฉด์ ์ ์ฉ๋ ์ ๋๋ฉ์ด์ ์ ๊ทธ๋ฆฌ๊ฑฐ๋ API๋ก ๋ถํฐ ์ ๋ณด๋ฅผ ๋ฐ์์ ํ๋ฉด์ ์ ๋ฐ์ดํธ ํ ๋ ์ด๊ณณ์ ๋ก์ง์ ์์น์ํค๋ฉด ์ข์ต๋๋ค. ์๋ํ๋ฉด ์ง๋์น๊ฒ ๋นจ๋ฆฌ ์ ๋๋ฉ์ด์ ์ ๊ทธ๋ฆฌ๊ฑฐ๋ API์์ ์ ๋ณด๋ฅผ ๋ฐ์์ ๋ทฐ ์ปจํธ๋กค๋ฌ๋ฅผ ์ ๋ฐ์ดํธ ํ ๊ฒฝ์ฐ ํ๋ฉด์ ๋ฐ์๋์ง ์์ต๋๋ค.viewDidDisappear- ๋ทฐ ์ปจํธ๋กค๋ฌ๊ฐ ํ๋ฉด์ ๋ํ๋ ์งํ์ ์คํ๋๋ค.
์์ธํ
-
๋ด๋น๊ฒ์ด์ ์ปจํธ๋กค๋ฌ๋ฅผ ์ ํํ๋ฉด ํ ์ด๋ธ ๋ทฐ ์ปจํธ๋กค๋ฌ๊ฐ ๋ค์ผ๋ก ์ถ๊ฐ๋๋ค.
-
ํ ์ด๋ธ ๋ทฐ ์ค๋ธ์ ํธ๋ฅผ ์ ํํ๊ณ [Editor] -> [Embed In] -> [Navigation Contoller] ๋ฐฉ์์ผ๋ก ์ถ๊ฐํด๋๋์ง๋ง ๋ค๋น๊ฒ์ด์ ์ปจํธ๋กค๋ฌ๋ฅผ ์ ํํ๋ฉด TableView๊ฐ ์๋์ผ๋ก ๋ฐ๋ผ์จ๋ค.
-
์ฃผ์ํ ์ ! ์ฒ์์ ์ค์ ๋ ๋ทฐ ์ปจํธ๋กค๋ฌ๋ฅผ ์ญ์ ํ๋ฉด initial View Controller๋ฅผ ๋ฐ๋์ ์ง์ ํด์ค์ผํ๋ค.
image-20210403184655760{: width="100" height="100"}
- ListViewController.swift
๋ค๋น๊ฒ์ด์ ๋ฐ์์ +๋ฅผ ํด๋ฆญํ์๋ ์๋์ฐฝ์ด ๋จ๊ณ ๊ฑฐ๊ธฐ์ ์ถ๊ฐ๋ ๊ธ์ ์์ฑํ ์ ์๋๋ก ๋ง๋ค๊ณ ์ถ๋ค. ๋ค์๊ณผ ๊ฐ์ด ๊ตฌํ
// // ListViewController.swift // Table-CellHeight // // Created by ์ผ์ฑํ on 2021ๅนด04ๆ03ๆฅ. // import UIKit class ListViewController : UITableViewController { // ํ ์ด๋ธ ๋ทฐ์ ์ฐ๊ฒฐ๋ ๋น ๋ฐฐ์ด์ ์ ์ํด์ค๋ค. var list = [String]() @IBAction func add(_ sender: Any) { let alert = UIAlertController(title: "๋ชฉ๋ก ์ ๋ ฅ", message: "์ถ๊ฐ๋ ๊ธ์ ์์ฑํด์ฃผ์ธ์.", preferredStyle: .alert) // ์๋ฆผ์ฐฝ์ ์ ๋ ฅ ํผ์ ์ถ๋ ฅํ๋ค. alert.addTextField() { (tf) in tf.placeholder = "๋ด์ฉ์ ์ ๋ ฅํ์ธ์" } // ok๋ฒํผ ๊ฐ์ฒด ์์ฑ let ok = UIAlertAction(title: "OK", style: .default){(_) in // ๋ฐฐ์ด์ ์ ๋ ฅ๋ ๊ฐ์ ์ถ๊ฐ ํ๊ณ ํ ์ด๋ธ ๊ฐฑ์ if let title = alert.textFields?[0].text { self.list.append(title) self.tableView.reloadData() } } // cancel ๊ฐ์ฒด ์์ฑ let cancel = UIAlertAction(title: "์ทจ์", style: .cancel, handler: nil) // ์๋ฆผ์ฐฝ ๊ฐ์ฒด์ ๋ฒํผ ๊ฐ์ฒด๋ฅผ ๋ฑ๋กํ๋ค. alert.addAction(ok) alert.addAction(cancel) self.present(alert, animated: false) } override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { return self.list.count } // ์ ์์ ๋ด์ฉ์ ๋ฃ์ด์ฃผ๋ ํจ์์ด๋ค. override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { // "cell" ์์ด๋๋ฅผ ๊ฐ์ง ์ ์ ์ฝ์ด์จ๋ค. ์์ผ๋ฉด UITableViewCell ์ธ์คํด์ค๋ฅผ ์์ฑํ๋ค. // cell ์์ด๋๋ฅผ ๊ฐ์ง ์ ์ ์ฝ์ด์ ์ต์ ๋ ํด์ ! ๊ทผ๋ ๊ทธ๊ฐ์ด nil ์ด๋ฉด UITaleVIewCell ์ธ์คํด์ค๋ฅผ ์๋ก ์์ฑํด! let cell = tableView.dequeueReusableCell(withIdentifier: "cell") ?? UITableViewCell() cell.textLabel?.text = list[indexPath.row] // ์ ์ ๊ธฐ๋ณธ ํ ์คํธ ๋ ์ด๋ธ ํ ์ ์ ํ์ ์์ค๋ค. ๋ณ๋๋ก ์์ฑ์ ์ง์ ํด์ฃผ์ง ์์ผ๋ฉด ๊ธ์๊ฐ ์๋ฌด๋ฆฌ ๊ธธ์ด๋ ํ์ค๋ก๋ง ํํ๋๋ค. 0์ผ๋ก ํ๋ฉด ๊ธ์ ๊ธธ์ด์ ๋ฐ๋ผ ๋์ด๊ฐ ์๋์ผ๋ก ๋์ด๋จ cell.textLabel?.numberOfLines = 0 return cell } // ์ ๋์ด๋ฅผ ์กฐ์ ํด์ค ๋ฉ์๋ ๊ฐ๋ก ํ์ ๋ํ ์ ๋ณด๋ฅผ ์ธ์ ๊ฐ์ผ๋ก ๋ฐ๊ณ , ๊ทธ ํ์ ๋์ด๋ฅผ ์ผ๋ง๋ก ๊ณ์ฐํ์ฌ ๋ฐํํด ์ค์ง ์ ํ๋ค. override func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat { let row = self.list[indexPath.row] // ๋์ด๋ฅผ ์กฐ์ ํด ์ค๋ค. let height = CGFloat(60 + (row.count / 30) * 20) // CGFloat๋ ๋ฉ์๋ ๋ฐํ ํ์ ์ ์ผ์น์์ผ์ค ๋ชฉ์ ์ผ๋ก ์ฌ์ฉํ ๊ฐ์ฒด์ด๋ค. return height } }
-
UIAlertController๊ฐ์ฒด๋ฅผ ๋จผ์ ํ์ฑํด์ค๋ค. 3๋ฒ์งธ ๊ฐ์ด ์๋์ฐฝ์ ์คํ์ผ์ ๊ฒฐ์ ํ๋ ํญ๋ชฉ์ด๋ค.actionSheet์alert๋ก ์ ํํ ์ ์๋ค. -
actionSheet๋ ์๋ฆผ์ฐฝ ๋ด๋ถ์ ์ ๋ ฅ ํ๋๋ฅผ ๋ฃ์ ๊ฒฝ์ฐ ์ฌ์ฉํ ์ ์๋ค. -
addTextField์ ์ ๋ ฅ ํผ์ ์ถ๊ฐ ํ๋ ๋ฉ์๋๋ฅผ ์ถ๊ฐํ๋ค. ํด๋ก์ ์ ๋ํ ์ดํด ๊ฐ ํ์ -
์๋ฆผ์ฐฝ์ ์ฐ๊ฒฐ๋ ๋ฒํผ ๊ฐ์ฒด๋ฅผ ํ์ฑํด์ค์ผํ๋ค. ์ธ ๋ฒ์งธ ์ธ์ ๊ฐ์ ์ฌ์ฉํ์ฌ ๋ฒํผ ํด๋ฆญ์ ๋ํ ์ก์ ์ ์ ์ํด ์ค ์์๋ค.
let ok = UIAlertAction(title: "OK", style: .default){(_) in // ๋ฐฐ์ด์ ์ ๋ ฅ๋ ๊ฐ์ ์ถ๊ฐ ํ๊ณ ํ ์ด๋ธ ๊ฐฑ์ if let title = alert.textFields?[0].text { self.list.append(title) self.tableView.reloadData() } }
-
์ด๋ถ๋ถ์ด ํํํด๋ก์ ์ธ๋ฐ
UIAlertActionํด๋์ค์ ์ธ๋ฒ์จฐ ์ธ์๊ฐ์ ์ฌ์ฉํ๋ฉด ํด๋ฆญํ์๋์ ์ด๋ค ํ๋์ ํ ์ง์ ๋ํ ๊ฒ์ ์ ์ํด ์ค ์ ์๋ค.์ ๋ถ๋ถ์ด ์ดํด๊ฐ ์๊ฐ์๋๋ฐ 3๋ฒ์งธ ์ธ์์ ํจ์๋ฅผ ๋ฃ์ด ๊ธฐ๋ฅ์ ๋์ํ๊ฒ ํด์ผํ๋๋ฐ ์ ๋ ๊ฒ ๋นผ์ ํด๋ก์ ํ์์ผ๋ก ๋ฃ์ด๋ ๋๋ค.
- A ?? B
๋ง์ฝ A๊ฐ nil์ด ์๋ ๊ฒฝ์ฐ ์ต์ ๋์ ํด์ ํ๊ณ , nil์ผ ๊ฒฝ์ฐ ๋์ B๊ฐ์ ์ฌ์ฉํ๋ผ๋ ๋ง์ด๋ค.
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { // "cell" ์์ด๋๋ฅผ ๊ฐ์ง ์ ์ ์ฝ์ด์จ๋ค. ์์ผ๋ฉด UITableViewCell ์ธ์คํด์ค๋ฅผ ์์ฑํ๋ค. // cell ์์ด๋๋ฅผ ๊ฐ์ง ์ ์ ์ฝ์ด์ ์ต์ ๋ ํด์ ! ๊ทผ๋ ๊ทธ๊ฐ์ด nildแ ต๋ฉด UITaleVIewCell ์ธ์คํด์ค๋ฅผ ์๋ก ์์ฑํด! let cell = tableView.dequeueReusableCell(withIdentifier: "cell") ?? UITableViewCell() cell.textLabel?.text = list[indexPath.row] return cell }
์ ํ ์ฌ์ด์ง ์ง์ ๋์ด๊ฐ์ ๊ณ์ฐํด์ ๋ง์ถ์ง ์์๋ ์ฝํ ์ธ ์ ๋ฐ๋ผ ์๋์ผ๋ก ๋์ ์ผ๋ก ๋์ด๋ฅผ ๊ฒฐ์ ํด์ฃผ๋ ๊ฒ
override func viewWillAppear(_ animated: Bool) { self.tableView.estimatedRowHeight = 50 // ๋์ถฉ์ ๋์ด๊ฐ self.tableView.rowHeight = UITableView.automaticDimension }
viewWillAppear: ๋ทฐ๊ฐ ๋ํ๋๊ธฐ ์ง์ ์ ํธ์ถ๋๋ค.viewDidload๋์ ๋ค๋ฅธ ์ ์ด ์๋๋ฐ ์ฑ์ ์์ ํ ์ด๊ธฐํ ์์ ์viewDidLoad์์ ์ฒ๋ฆฌํด๋ ๋์ง๋ง ๋ค๋ฅธ ๋ทฐ์์ ๊ฐ๋ค๊ฐ ๋ค์ ๋์์ค๋ ์ํฉ์์๋ viewWillAppear์์ ํด์ฃผ๋ฉด๋๋ค.
์์ธํ
ํ ์ด๋ธ ๋ทฐ ์ปจํธ๋กค๋ฌ๋ฅผ ์ฌ์ฉํ๊ฒ ๋๋ฉด ๊ฒ์๋ฐ ๋ฑ์ UI๋ฅผ ๋จ์ํ ํ ์ด๋ธ ๋ทฐ ์์๋ ์ถ๊ฐํ๋ ๊ฑด ๊ฐ๋ฅํ์ง๋ง ์ฌ๋ฌ๊ฐ์ง ๋ทฐ๋ก ๊ตฌ์์ค๋๋ ํ๋ฉด์ ์ ์ํด์ผํ ๋๋ ์ถฉ๋ถํ ๊ตฌํํ๊ธฐ ์ด๋ ต๋ค. ๋ฐ๋ผ์ ์ผ๋ฐ ๋ทฐ ์ปจํธ๋กค๋ฌ์์ ํ ์ด๋ธ ๋ทฐ๋ฅผ ์ง์ ๊ตฌํํ๋ ๊ฒฝ์ฐ๊ฐ ๋์ฑ ๋ง๋ค.
- ์ต์คํ ์ ๋ถ๋ฆฌํ๊ธฐ : ๋ธ๋ฆฌ๊ฒ์ดํธ๋ฅผ ์ฌ์ฉํ ๋ ๊ฐ์ ํ์ผ์์ extension์ ์ฐ๋ฉด ํ๋์ ์ฝ๋์์ ์์ฑํ์ง ์๊ณ ๋ธ๋ฆฌ๊ฒ์ดํธ๋ณ, ๋ฉ์๋๋ณ๋ก ์ฝ๋๋ฅผ ๊ตฌ์ฑํ ์ ์๋ค.
// ํ ์ด๋ธ์ ๊ตฌ์ฑํ๊ธฐ ์ํด ํ์ํ ๋ฉ์๋๋ฅผ ์ ์ํ๋ค. extension ViewController: UITableViewDataSource { func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { return 5 } func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { let cell = tableView.dequeueReusableCell(withIdentifier: "cell")! cell.textLabel?.text = "\(indexPath.row)๋ฒ์งธ ๋ฐ์ดํฐ ์ ๋๋ค." return cell } } // ํ ์ด๋ธ์์ ๋ฐ์ํ๋ ์ก์ /์ด๋ฒคํธ์ ๊ด๋ จ๋ ๋ฉ์๋๋ฅผ ์ ์ํ๋ค. extension ViewController: UITableViewDelegate { func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { NSLog("\(indexPath.row)๋ฒ์งธ ๋ฐ์ดํฐ๊ฐ ํด๋ฆญ๋จ.") } }
-
ํ ์ด๋ธ ๋ทฐ ์ปจํธ๋กค๋ฌ์์ ์ฐจ์ด์ ์ด ์๋๋ฐ
override๊ฐ ์๋ค๋ ๊ฒ์ด๋ค. ํ๋กํ ์ฝ์ ๋ํ ๋ฉ์๋๋ฅผ ์ง์ ๊ตฌํํ๋ ๊ฒ์ด๊ธฐ ๋๋ฌธ์ ์ฌ์ ์๊ฐ ์๋๋ค. -
๋ฐ๋์!!! ํ ์ด๋ธ ๋ทฐ๋ฅผ ์๋จ ๋ทฐ ์ปจํธ๋กค๋ฌ ์์ด์ฝ์ผ๋ก ๋๋๊ทธํด์ [dataSourced] ์ [delegate]์ ์ฐ๊ฒฐํด์ค์ผํ๋ค.
- ๋ธ๋ฆฌ๊ฒ์ดํธ๋ฅผ ์ฌ์ฉํ๋ ๊ฐ์ฒด๊ฐ ์ถ๊ฐ๋๋ฉด ์ด๋ค ๊ฐ์ฒด๊ฐ ํ์ํ ๋ฉ์๋๋ฅผ ์ด๋์ ์ฐพ์ ์ ์๋์ง์ ๋ํ ์ ๋ณด๋ฅผ ์๋ ค์ค์ผํ๊ธฐ ๋๋ฌธ์ด๋ค.
self.tabeView.dataSource = self,self.tableView.delegate=self์ ๋์ผํ๋ค.
์์ธํ
์์์๋ฅผ ์ ํ๋ค๋ ์๋ฏธ์ด๋ค.
-
๋๋์ฒด ์ด๊ฒ ๋ฌด์จ ์๋ฆฌ์ธ์ง ์ดํด๊ฐ๊ฐ์ง ์์๋๋ฐ ๊ฒฐ๋ก ์
์ด๋ค ๊ฐ์ฒด์ ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ๋ฉด ๋ด๊ฐ ๋์ ์ฒ๋ฆฌํ ๊ป๋ผ๋ ์๋ฏธ๋ก ๋ฐ์ ๋ค์ด๋ฉด๋๋ค. -
textField.delegate=self์ฌ๊ธฐ์ self๋ ํ์ฌ ํด๋์ค์ธViewController์ด๋ค.์ฆ textField์ ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ๋ฉด
ViewController์์ ํ๋กํ ์ฝ์ ๋ฐ๋ผ ์๋ต์ ํด์ค๋ค๋ ์๋ฏธ์ด๋ค.
// ํ๋กํ ์ฝ์ ์ฑํํ๋ ์์ ์ ํ๋ค. class ViewController: UIViewController, UITextFieldDelegate { override func viewDidLoad() { super.viewDidLoad() textField.delegate = self } }
textFieldShouldReturnํจ์๋UITextFieldDelegate์์ ์ ์๋์ด ์๋ ํจ์์ด๋ค.- ์ฆ ์ด ๋์์ ๋์ ํด์ค ํจ์๋ฅผ ๋ถ๋ฌ์ ๊ทธ ํจ์์์ ์ฐ๋ฆฌ๊ฐ ํ๊ณ ์ถ์ ์ผ์ '๊ตฌํ' ํ๋ฉด ๋๋ค.
func textFieldShouldReturn(_ textField: UITextField) -> Bool {
enteredLabel.text = textField.text
return true
}
3๊ฐ์ง ๋ฐฉ๋ฒ์ด ์์ 1) ๋ฉ์์ง์ฐฝ(์๋ฆผ์ฐฝ) 2)๋ก์ปฌ ์๋ฆผ 3) ์๋ฒ ์๋ฆผ(ํธ์ ์๋ฆผ)
-
๋ฉ์์ง์ฐฝ์ ์ฑ์ด ์คํ ์ค์ผ ๋๋ง ๋์ํ๊ธฐ ๋๋ฌธ์ ๋ก์ปฌ ์๋ฆผ, ์๋ฒ ์๋ฆผ์ด ํ์ํ๋ค.
-
๋ก์ปฌ ํธ์ : ์ฑ ๋ด๋ถ์์ ํน์ ํ๋ก์ธ์ค์ ์ํด ๋ฑ๋ก๋ ๋ฉ์ธ์ง๋ฅผ iOS๊ฐ ์ ๋ฌํ๋ ๋ฐฉ์
-
์๋ฒ ํธ์ : ๋ณ๋์ ์๋ฒ๋ฅผ ํตํด APNs๋ผ๋ ์ ํ ๊ณ ์ ์ ๋ฉ์์ง ์์คํ ์๊ฒ ๋ณด๋ธ ๋ฉ์ธ์ง๊ฐ ๋คํธ์ํฌ๋ฅผ ํตํด ์ ๋ฌ๋๋ ๋ฐฉ์
-
์๋ฒ ํธ์๋ ์ฑ ์๋น์ค ์ด์์๊ฐ ํ์ํ ์์ ์ ์ธ์คํด์ค ๋ฉ์์ง๋ฅผ ๋ง๋ค์ด ๋ ๋ฆด ์ ์๋ค. ๋ก์ปฌ ํธ์๋ ์ฑ์ ์ ์ํ ๋ ์ฑ ๋ด๋ถ ์ฝ๋์ ์ฌ์ด ๋์ ๋ฉ์์ง๊ฐ ์ ๋ฌ๋์ ํ๊ณ๊ฐ ์์ ์ ์์.
-
๋ณ๋์ ์๋ฒ๊ฐ ํ์ํ๊ธฐ ๋๋ฌธ์ ์๋ฒ๊ฐ ํ์ํ๋ค.
-
๋ฉ์์ง ์ฐฝ์ ๊ตฌํํ๋ ๊ฐ์ฒด๋ UIAlertController์ด๋ค.
- ๋๊ฐ์ง ํํ๊ฐ ์๋ค. ํ๋๋ ์๋ฆผ์ฐฝ, ๋ค๋ฅธ ํ๋๋ ์ก์ ์ํธ์ด๋ค.
-
์๋ฆผ์ฐฝ - ๋ชจ๋ฌ ๋ฐฉ์์ผ๋ก ์ฐฝ์ด ๋ซํ ๋๊น์ง ํ๋ฉด์ ๋ค๋ฅธ ๋ถ๋ถ์ ๋ฐ์ํ ์ ์๋๋ก ์ ๊ธด๋ค.
-
์ก์ ์ํธ - ๋ฉ์์ง๊ฐ ๋ ์๋ ๋์์๋ ๋ฉ์ธ์ง ์ฐฝ์ด ์๋ ๋ค๋ฅธ ์์ญ์ ๊ฑด๋๋ฆด ์ ์์ผ๋ฉฐ, ๊ทธ ๊ฒฐ๊ณผ๋ก ์ก์ ์ํธ ์ฐฝ์ด ๋ซํ๋ค.
-
UIAlertController์๋ ์ฌ์ฉ์๊ฐ ์ํ๋ ๋๋ก ๋ฒํผ์ ์ถ๊ฐํ ์ ์๋ค. ๋ฒํผ์
UIAlertAction๊ฐ์ฒด์ ์ํด์ ๊ตฌํ๋๋๋ฐ, ํ์ํ ๋ฒํผ ์๋งํผ UIAlertAction ๊ฐ์ฒด๋ฅผ ๊ตฌํํ๊ณ , ์ด ๋ฒํผ์ด ํด๋ฆญ ๋์์ ๋ ์คํํด์ค ์ฝ๋๋ฅผ ์ธ์ ๊ฐ์ผ๋ก ๋ฃ์ด ์ด๊ธฐํ ํ๋ฉด ๋๋ค. -
UIAlertController๋ ํ๋์ ๋ทฐ ์ปจํธ๋กค๋ฌ ์ด๊ธฐ ๋๋ฌธ์, ์คํ ์ญ์ ๋ทฐ ์ปจํธ๋กค๋ฌ์ ์ํ ํ๋ฉด ์ด๋ ๋ฐฉ์์ ์ฌ์ฉํด์ผํ๋ค. ์ฆ. ๋ ๋ค๋ฅธ ํ๋์ ํ๋ฉด์ด๋ผ๊ณ ์๊ฐํ๊ณ ํ๋ฉด์ ์ ํ์์ผ ์ฃผ์ด์ผํ๋ค.๋จ, ๋ฒํผ์ด ํด๋ฆญ๋๋ฉด ์ฐฝ์ ์๋์ผ๋ก ๋ซํ๊ธฐ ๋๋ฌธ์dismiss(animated:)๋ฉ์๋๋ฅผ ๊ตฌํํด ์ค ํ์๋ ์๋ค. -
์บ์ฌ ํ์ ์ ๋ฒํผ์ ์ก์ ์ํธ์ฐฝ์์ ํ๋ฒ ๋ฐ์ ์ธ์๊ฐ ์๋ค.
์๋์ ๊ฐ์ด ๋ฑ ํ๊ฐ์ ์์๋ง cancel์ฐฝ์์ ๋ถ๋ฆฌ๋๊ธฐ ๋๋ฌธ์ด๋ค.
let cancel = UIAlertAction(title: "์ทจ์", style: .cancel) // ์ทจ์ ๋ฒํผ
-
ํ๋ฉด์ด ๋จ์๋ง์ ์๋์ผ๋ก ๋ฉ์์ง ์ฐฝ์ ๋์์ฃผ์ด ํ ๋? ๋คํธ์ํฌ ๊ธฐ๋ฐ ์๋น์ค์์ ๋คํธ์ํฌ๊ฐ ์ฐ๊ฒฐ ๋์ง ์์์๋? ์ด๋ป๊ฒ ์ฐฝ์ ๋์์ค์ผํ๋??
viewDidLoad()๋ด์์ ๋ฉ์์ง ์ฐฝ์ ๊ตฌํํ๋ ค๋ฉด ๋ฐํ์ ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ค. ์?? ์์ง ๋ฉ์์ง ์ฐฝ์ ์ฒ๋ฆฌํด ์ค ๋ทฐ๊ฐ ํ๋ฉด์ ๊ตฌํ๋์ง ์์ ์ํ์์ ํ๋ฉด ์ ํ์ ์๋ํ๊ธฐ ๋๋ฌธ!!viewDidAppear()๋ฉ์๋๋ฅผ ์ฌ์ฉํด์ ๋ฉ์์ง ์ฐฝ์ ์ฒ๋ฆฌํด์ค๋ค. ์??? ๋ทฐ๊ฐ ์์ ํ ํ๋ฉด์ ํํ๋๊ณ ํธ์ถ๋๊ธฐ ๋๋ฌธ์ ํ๋ ์ ํธ ๋ฉ์๋๋ฅผ ์คํํ๋๋ฐ ์๋ฌด๋ฐ ๋ฌธ์ ๊ฐ ์๋ค.
-
์๋์ฐฝ์ ํ ์คํธ ํ๋์ ์์ฑ์ ์ค์ ํ๊ณ ์ถ์ ๋๋ ์๋์ ๊ฐ์ ํด๋ก์ ๋ฌธ๋ฒ์ ์ฌ์ฉ์์ผ์ค๋ค.
alert.addTextField(configurationHandler: { (tf) in tf.placeholder = "์ํธ" //์๋ด ๋ฉ์ธ์ง tf.isSecureTextEntry = true // ๋น๋ฐ๋ฒํธ์ฒ๋ฆฌ })
- ํ์ธ ๋ฒํผ์ ํด๋ฆญํ ์คํํ๋ ํจ์๋ฅผ ์ง์ ํด ์ค ์ ์๋ค.
textField์ ์๋ ์ฌ๋ฌ๊ฐ ์ด๊ธฐ ๋๋ฌธ์ textfields์์ฑ ํ์ ์ด ๋ฐฐ์ด๋ก ์ด๋ค์ ธ ์๋ค. ๋ฐ๋ผ์ ์ฒซ๋ฒ์งธ ํ ์คํธํ๋๋ฅผ ์ฐธ์กฐํ๋ ค๋ฉด ์ธ๋ฑ์ค 0๋ฒ์ ํตํด ๋ฐฐ์ด์ ์ฒซ๋ฒ์งธ ์ธ์๋ฅผ ์ฝ์ด ๋ค์ฌ์ผํ๋ค.
let ok = UIAlertAction(title: "๋ก๊ทธ์ธ", style: .default){(_) in if let tf = alert.textFields?[0] { print("์ ๋ ฅ๋ ๊ฐ์ \( tf.text!)์ ๋๋ค.") } else { print("์ ๋ ฅ๋ ๊ฐ์ด ์์ต๋๋ค.") } }
- ํ ์คํธ ํ๋(์ธํ์ฐฝ) ์ด ์ฌ๋ฌ๊ฐ ์ผ ๊ฒฝ์ฐ ์๋์ ๊ฐ์ด ์ง์ ํ๋ค.
let loginId = alert.textFields?[0].text let loginPw = alert.textFields?[1].text // ๋๋ฒ์งธ ํ ์คํธ ํ๋์ด๊ธฐ ๋๋ฌธ์ ๋๋ฒ์งธ ๋ฐฐ์ด๋ก ์ง์ ํ๋ค.
์ฑ ๋ด๋ถ์์ ๋ง๋ ํน์ ๋ฉ์์ง๋ฅผ iOS์ ์๋ฆผ ์ผํฐ๋ฅผ ํตํด ์ ๋ฌํ๋ ๋ฐฉ๋ฒ์ด๋ค. ์ฑ์ด ์ข ๋ฃ ๋์ด ์๊ฑฐ๋ ๋ฐฑ๊ทธ๋ผ์ด๋ ์ํ์ผ๋ ๋ฒ ์์ง๋ฅผ ์ ๋ฌ ํ ์ ์๋ค.
UserNotification์ UIKit ํ๋ ์ ์ํฌ์ ๋ ๋ฆฝ๋ ํ๋ ์์ํฌ ์ด๋ค. ๋ฐ๋ผ์ ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํ๋ ค๋ฉด ํ์ผ ์๋จ์ ๋ฐ์ ๊ตฌ๋ฌธ์ ์ถ๊ฐํด์ค์ผํ๋ค.
import UserNotification-
UNMutableNotificationContent: ๋ก์ปฌ ์๋ฆผ ํ์ดํ, ์๋ธ ํ์ดํ ๋ฐ ์๋ฆผ ๋ฉ์์ง๋ฅผ ์ค์ ํ ์ ์์. ์ฑ ์์ด์ฝ์ ํ์๋ ๋ฐฐ์ง๋ ์ฌ์ด๋ ์ค์ ๋ํ ๊ฐ๋ฅ -
UNTimeIntervalNotificationTrigger: ์๋ฆผ ๋ฐ์ก ์กฐ๊ฑด ๊ด๋ฆฌ, ๋ฐ์ ์๊ฐ๊ณผ ๋ฐ๋ณต์ฌ๋ถ -
UNNotificationRequest: ์์ ๋๊ฐ์ง ๊ฐ์ฒด์ ์๋ฆผ ๋ฐ์ก ์กฐ๊ฑด ๊ฐ์ฒด๋ฅผ ์ธ์ ๊ฐ์ผ๋ก ํ์ฌ ๊ทธ ๊ฒฐ๊ณผ๋ก ์๋ฆผ ์์ฒญ ๊ฐ์ฒด๊ฐ ์์ฑ๋๊ฒ ๋๋ค.UNUserNotificationCenter: ๋ฐ์ก์ ๋ด๋นํ๋ ์ผํฐ, ์ด ๊ฐ์ฒด๋ ์ฑ๊ธํด ๋ฐฉ์์ผ๋ก ๋์ํ๋ค. -> ๋ค๋ก ์ธ์คํด์ค๋ฅผ ์์ฑํ์ง ์๊ณ current() ๋ฉ์๋๋ฅผ ํตํด ์ฐธ์กฐ ์ ๋ณด๋ง ๊ฐ์ ธ์ฌ ์ ์๋ค.