Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

SaltCastle77/Swift_xcode_basic

Folders and files

NameName
Last commit message
Last commit date

Latest commit

History

6 Commits

Repository files navigation

IOS ๊ณต๋ถ€ ์ •๋ฆฌ

๊ณ ์ž๋ฃŒ

  • ๊ผผ๊ผผํ•œ ์žฌ์€์”จ์˜ Swift ๊ธฐ๋ณธํŽธ, ์‹ค์ „ํŽธ
  • https://zeddios.tistory.com/

1. ์Šค์œ„ํ”„ํŠธUI vs ์Šคํ† ๋ฆฌ๋ณด๋“œ

์ž์„ธํžˆ
  1. xcode 11๋ฒ„์ „์—์„  ์ด๋ฅธ๋ฐ” SWIFT UI๋ž€ ์ด๋ฆ„์œผ๋กœ ์ƒˆ๋กœ์šด ๋ฐฉ์‹์˜ ๋””์ž์ธ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ œ๊ณตํ•œ๋‹ค. ์• ํ”Œ์€ ์˜ค๋žซ๋™์•ˆ ์Šคํ† ๋ฆฌ๋ณด๋“œ ํ˜น์€ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์ ์œผ๋กœ ์งค ์ˆ˜ ์žˆ๋Š” UI ๋ฐฉ๋ฒ• ๋‘ ๊ฐ€์ง€๋ฅผ ์ œ๊ณตํ–ˆ๋‹ค. SWIFT UI๋Š” ์ด ๋ฐฉ์‹์„ ํƒˆํ”ผํ•˜์—ฌ, ๋‚˜๋ˆ ์ง€๋Š”(์ชผ๊ฐœ์ง€๋Š”) ํ™”๋ฉด ๊ฒฝํ—˜์„ ์ œ๊ณตํ•œ๋‹ค.
  • ์–ด๋–ป๊ฒŒ ๋ ˆ์ด์•„์›ƒ์ด ๋ณด์ด๊ณ  ์ž‘๋™ํ•˜๋Š”์ง€์— ๋Œ€ํ•œ ์ƒˆ๋กœ์šด UI

  • ์‹ค์‹œ๊ฐ„์œผ๋กœ Swift ์ฝ”๋“œ ์ž‘์„ฑ์‹œ UI ๋ฏธ๋ฆฌ๋ณด๊ธฐ๋ฅผ ์ œ๊ณตํ•จ

  1. UIKit -> SwiftUI

Swift UI๋Š” ๋ง ๊ทธ๋Œ€๋กœ UI๊ด€๋ จ ํ”„๋ ˆ์ž„์›Œํฌ๋‹ค. ๊ทธ๋Ÿฌ๋ฏ€๋กœ ๊ธฐ์กด์— ์‚ฌ์šฉํ•˜๊ณ ์žˆ๋˜, ๊ฐ๊ฐ์˜ ๋ทฐ ์ปจํŠธ๋กค๋Ÿฌ ํด๋ž˜์Šค์— ๊ฑฐ์˜ ๋“ค์–ด๊ฐ€์žˆ๋˜

import UIKit

์ด ๋ถ€๋ถ„์„

import SwiftUI

๋กœ ๋ฐ”๋€๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค. ๊ทธ๋Ÿฌ๋ฏ€๋กœ SwiftUI๋ฅผ Importํ•˜๊ฒŒ ๋  ๊ฒฝ์šฐ UI๊ฐ€ ์•ž์— ๋ถ™์—ˆ๋˜ ์• ๋“ค์ด ๋‹ค ํƒˆ๋ฝํ•˜๊ณ  ์ƒˆ๋กญ๊ฒŒ ๋ณ€ํ•œ๋‹ค.

  1. ์•„์ง์€ UIkit ์ฆ‰ ์Šคํ† ๋ฆฌ๋ณด๋“œ๊ฐ€ ๋งŽ์ด ์‚ฌ์šฉ๋˜๋Š” ์ถ”์„ธ์ด๋‚˜ ๊ณง SwiftUI๋กœ ๋„˜์–ด๊ฐˆ ๊ฒƒ ๊ฐ™๋‹ค.-> SwiftUI๋กœ ๋ฐฐ์šฐ๋Š”๊ฒŒ ๋” ๋‚˜์„ ์ˆ˜๋„ ์žˆ์Œ. ํ•˜์ง€๋งŒ ์ด์ „๋ฒ„์ „์„ ๊ณ ์ณ์•ผํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋‘˜๋‹คํ•˜๊ธฐ์—๋Š” ๋งŽ์ด ํž˜๋“ค๋‹ค.

2. ๋ทฐ ์ปจํŠธ๋กค๋Ÿฌ์˜ ์ƒํƒœ ๋ณ€ํ™”์™€ ์ƒ๋ช…์ฃผ๊ธฐ

์ž์„ธํžˆ

img

๋ทฐ ์ปจํŠธ๋กค๋Ÿฌ์˜ ์ƒ๋ช…์ฃผ๊ธฐ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋‚˜๋ˆŒ ์ˆ˜ ์žˆ๋‹ค.

  • Appearing: ๋ทฐ ์ปจํŠธ๋กค๋Ÿฌ๊ฐ€ ์Šคํฌ๋ฆฐ์— ๋“ฑ์žฅํ•˜๊ธฐ ์‹œ์ž‘ํ•œ ์ˆœ๊ฐ„๋ถ€ํ„ฐ ๋“ฑ์žฅ์„ ์™„๋ฃŒํ•˜๊ธฐ ์ง์ „๊นŒ์ง€์˜ ์ƒํƒœ, ๋‹ค๋ฅธ ๋ทฐ ์ปจํŠธ๋กค๋Ÿฌ์™€ ๊ต์ฐจ๋˜๊ธฐ๋„ํ•จ
  • Appeared : ๋ทฐ ์ปจํŠธ๋กœ๋Ÿด๊ฐ€ ์™„์ „ํžˆ ๋“ฑ์žฅํ•œ ์ƒํƒœ
  • Disappearing : ๋ทฐ ์ปจํŠธ๋กค๋Ÿฌ๊ฐ€ ์Šคํฌ๋ฆฐ์—์„œ ๊ฐ€๋ ค์ง€๊ธฐ ์‹œ์ž‘ํ•ด์„œ ์™„์ „ํžˆ ๊ฐ€๋ ค์ง€๊ธฐ ์ง์ „์˜ ์ƒํƒœ, ๋˜๋Š” ํ‡ด์žฅํ•˜๊ธฐ ์‹œ์ž‘ํ•ด์„œ ์™„์ „ํžˆ ํ‡ด์žฅํ•œ ์ƒํƒœ, ์ƒˆ๋กœ ๋“ฑ์žฅํ•˜๋Š” ๋ทฐ ์ปจํŠธ๋กค๋Ÿฌ์™€ ๊ต์ฐจ
  • Disappeared : ๋ทฐ ์ปจํŠธ๋กค๋Ÿฌ๊ฐ€ ์Šคํฌ๋ฆฐ์—์„œ ์™„์ „ํžˆ ๊ฐ€๋ ค์กŒ๊ฑฐ๋‚˜ ํ˜น์€ ํ‡ด์žฅํ•œ ์ƒํƒœ๋ฅผ ์˜๋ฏธํ•œ๋‹ค.

์ค‘์š” ๋ทฐ ์ปจํŠธ๋กค๋Ÿฌ ํ•จ์ˆ˜๋“ค

  • viewWillAppear(): ํ™”๋ฉด์ด ๋‹ค์‹œ ๋“ฑ์žฅํ•˜๊ธฐ ์‹œ์ž‘ํ•œ์ƒํƒœ(=Appearing)๋กœ ๋ฐ”๋€Œ๋Š” ๋™์•ˆ ๋ทฐ ์ปจํŠธ๋Ÿด๋Ÿฌ๋Š” ์•ฑ ๊ฐ์ฒด์— ์˜ํ•ด ์ด ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๊ณ  ์ฃผ๋กœ

ํ™”๋ฉด์ด ๋“ฑ์žฅํ•  ๋•Œ ๋งˆ๋‹ค ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐฑ์‹  ํ•ด์ฃผ๊ณ  ์‹ถ๋‹ค๋ฉด ์ด ๋ฉ”์†Œ๋“œ๋ฅผ override ํ•ด์„œ ์›ํ•˜๋Š” ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•œ๋‹ค.

  • ViewDidAppear - ๋ทฐ ์ปจํŠธ๋กค๋Ÿฌ๊ฐ€ ํ™”๋ฉด์— ๋‚˜ํƒ€๋‚œ ์งํ›„์— ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค. ํ™”๋ฉด์— ์ ์šฉ๋  ์• ๋‹ˆ๋ฉ”์ด์…˜์„ ๊ทธ๋ฆฌ๊ฑฐ๋‚˜ API๋กœ ๋ถ€ํ„ฐ ์ •๋ณด๋ฅผ ๋ฐ›์•„์™€ ํ™”๋ฉด์„ ์—…๋ฐ์ดํŠธ ํ•  ๋•Œ ์ด๊ณณ์— ๋กœ์ง์„ ์œ„์น˜์‹œํ‚ค๋ฉด ์ข‹์Šต๋‹ˆ๋‹ค. ์™œ๋ƒํ•˜๋ฉด ์ง€๋‚˜์น˜๊ฒŒ ๋นจ๋ฆฌ ์• ๋‹ˆ๋ฉ”์ด์…˜์„ ๊ทธ๋ฆฌ๊ฑฐ๋‚˜ API์—์„œ ์ •๋ณด๋ฅผ ๋ฐ›์•„์™€ ๋ทฐ ์ปจํŠธ๋กค๋Ÿฌ๋ฅผ ์—…๋ฐ์ดํŠธ ํ•  ๊ฒฝ์šฐ ํ™”๋ฉด์— ๋ฐ˜์˜๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • viewDidDisappear - ๋ทฐ ์ปจํŠธ๋กค๋Ÿฌ๊ฐ€ ํ™”๋ฉด์— ๋‚˜ํƒ€๋‚œ ์งํ›„์— ์‹คํ–‰๋œ๋‹ค.

2613D13C58C64DE32C

3. ํ…Œ์ด๋ธ” ๋ทฐ๋ฅผ ์ด์šฉํ•œ ๋ฐ์ดํ„ฐ ๋ชฉ๋ก๊ตฌํ˜„

์ž์„ธํžˆ
  • ๋‚ด๋น„๊ฒŒ์ด์…˜ ์ปจํŠธ๋กค๋Ÿฌ๋ฅผ ์„ ํƒํ•˜๋ฉด ํ…Œ์ด๋ธ” ๋ทฐ ์ปจํŠธ๋กค๋Ÿฌ๊ฐ€ ๋ค์œผ๋กœ ์ถ”๊ฐ€๋œ๋‹ค.

  • ํ…Œ์ด๋ธ” ๋ทฐ ์˜ค๋ธŒ์ ํŠธ๋ฅผ ์„ ํƒํ•˜๊ณ  [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๋ฒˆ์งธ ์ธ์ž์— ํ•จ์ˆ˜๋ฅผ ๋„ฃ์–ด ๊ธฐ๋Šฅ์„ ๋™์ž‘ํ•˜๊ฒŒ ํ•ด์•ผํ•˜๋Š”๋ฐ ์ €๋ ‡๊ฒŒ ๋นผ์„œ ํด๋กœ์ € ํ˜•์‹์œผ๋กœ ๋„ฃ์–ด๋„ ๋œ๋‹ค.

Nil-Coalescing Operatior

  • 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์—์„œ ํ•ด์ฃผ๋ฉด๋œ๋‹ค.

4. ์ผ๋ฐ˜ ๋ทฐ ์ปจํŠธ๋กค๋Ÿฌ์—์„œ ํ…Œ์ด๋ธ” ๋ทฐ ์‚ฌ์šฉํ•˜๊ธฐ

์ž์„ธํžˆ

ํ…Œ์ด๋ธ” ๋ทฐ ์ปจํŠธ๋กค๋Ÿฌ๋ฅผ ์‚ฌ์šฉํ•˜๊ฒŒ ๋˜๋ฉด ๊ฒ€์ƒ‰๋ฐ” ๋“ฑ์˜ 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 ์™€ ๋™์ผํ•˜๋‹ค.

5. ๋ธ๋ฆฌ๊ฒŒ์ดํŠธ ํŒจํ„ด(์ค‘์š”!)

์ž์„ธํžˆ

์œ„์ž„์ž๋ฅผ ์ •ํ•œ๋‹ค๋Š” ์˜๋ฏธ์ด๋‹ค.

  • ๋„๋Œ€์ฒด ์ด๊ฒŒ ๋ฌด์Šจ ์†Œ๋ฆฌ์ธ์ง€ ์ดํ•ด๊ฐ€๊ฐ€์ง€ ์•Š์•˜๋Š”๋ฐ ๊ฒฐ๋ก ์€ ์–ด๋–ค ๊ฐ์ฒด์— ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ๋‚ด๊ฐ€ ๋Œ€์‹  ์ฒ˜๋ฆฌํ• ๊ป˜ ๋ผ๋Š” ์˜๋ฏธ๋กœ ๋ฐ›์•„ ๋“ค์ด๋ฉด๋œ๋‹ค.

  • 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
 }

6. ์‚ฌ์šฉ์ž์—๊ฒŒ ๋ฉ”์„ธ์ง€๋ฅผ ์ „๋‹ฌํ•˜๋Š” ๋ฐฉ๋ฒ•

3๊ฐ€์ง€ ๋ฐฉ๋ฒ•์ด ์žˆ์Œ 1) ๋ฉ”์‹œ์ง€์ฐฝ(์•Œ๋ฆผ์ฐฝ) 2)๋กœ์ปฌ ์•Œ๋ฆผ 3) ์„œ๋ฒ„ ์•Œ๋ฆผ(ํ‘ธ์‹œ ์•Œ๋ฆผ)

  • ๋ฉ”์‹œ์ง€์ฐฝ์€ ์•ฑ์ด ์‹คํ–‰ ์ค‘์ผ ๋•Œ๋งŒ ๋™์ž‘ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋กœ์ปฌ ์•Œ๋ฆผ, ์„œ๋ฒ„ ์•Œ๋ฆผ์ด ํ•„์š”ํ•˜๋‹ค.

  • ๋กœ์ปฌ ํ‘ธ์‹œ : ์•ฑ ๋‚ด๋ถ€์—์„œ ํŠน์ • ํ”„๋กœ์„ธ์Šค์— ์˜ํ•ด ๋“ฑ๋ก๋œ ๋ฉ”์„ธ์ง€๋ฅผ iOS๊ฐ€ ์ „๋‹ฌํ•˜๋Š” ๋ฐฉ์‹

  • ์„œ๋ฒ„ ํ‘ธ์‹œ : ๋ณ„๋„์˜ ์„œ๋ฒ„๋ฅผ ํ†ตํ•ด APNs๋ผ๋Š” ์• ํ”Œ ๊ณ ์œ ์˜ ๋ฉ”์‹œ์ง• ์‹œ์Šคํ…œ์—๊ฒŒ ๋ณด๋‚ธ ๋ฉ”์„ธ์ง€๊ฐ€ ๋„คํŠธ์›Œํฌ๋ฅผ ํ†ตํ•ด ์ „๋‹ฌ๋˜๋Š” ๋ฐฉ์‹

    • ์„œ๋ฒ„ ํ‘ธ์‹œ๋Š” ์•ฑ ์„œ๋น„์Šค ์šด์˜์ž๊ฐ€ ํ•„์š”ํ•œ ์‹œ์ ์— ์ธ์Šคํ„ด์Šค ๋ฉ”์‹œ์ง€๋ฅผ ๋งŒ๋“ค์–ด ๋‚ ๋ฆด ์ˆ˜ ์žˆ๋‹ค. ๋กœ์ปฌ ํ‘ธ์‹œ๋Š” ์•ฑ์„ ์ œ์ž‘ํ• ๋•Œ ์•ฑ ๋‚ด๋ถ€ ์ฝ”๋“œ์— ์‹ฌ์–ด ๋†“์€ ๋ฉ”์‹œ์ง€๊ฐ€ ์ „๋‹ฌ๋˜์„œ ํ•œ๊ณ„๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ์Œ.

    • ๋ณ„๋„์˜ ์„œ๋ฒ„๊ฐ€ ํ•„์š”ํ•˜๊ธฐ ๋–„๋ฌธ์— ์„œ๋ฒ„๊ฐ€ ํ•„์š”ํ•˜๋‹ค.

6.1 ๋ฉ”์„ธ์ง€ ์•Œ๋ฆผ์ฐฝ - UIAlertController

๋ฉ”์‹œ์ง€ ์ฐฝ์„ ๊ตฌํ˜„ํ•˜๋Š” ๊ฐ์ฒด๋Š” UIAlertController์ด๋‹ค.

  • ๋‘๊ฐ€์ง€ ํ˜•ํƒœ๊ฐ€ ์žˆ๋‹ค. ํ•˜๋‚˜๋Š” ์•Œ๋ฆผ์ฐฝ, ๋‹ค๋ฅธ ํ•˜๋‚˜๋Š” ์•ก์…˜์‹œํŠธ์ด๋‹ค.
  1. ์•Œ๋ฆผ์ฐฝ - ๋ชจ๋‹ฌ ๋ฐฉ์‹์œผ๋กœ ์ฐฝ์ด ๋‹ซํž ๋•Œ๊นŒ์ง€ ํ™”๋ฉด์˜ ๋‹ค๋ฅธ ๋ถ€๋ถ„์€ ๋ฐ˜์‘ํ•  ์ˆ˜ ์—†๋„๋ก ์ž ๊ธด๋‹ค.

  2. ์•ก์…˜์‹œํŠธ - ๋ฉ”์‹œ์ง€๊ฐ€ ๋–  ์žˆ๋Š” ๋™์•ˆ์—๋„ ๋ฉ”์„ธ์ง€ ์ฐฝ์ด ์•„๋‹Œ ๋‹ค๋ฅธ ์˜์—ญ์„ ๊ฑด๋“œ๋ฆด ์ˆ˜ ์žˆ์œผ๋ฉฐ, ๊ทธ ๊ฒฐ๊ณผ๋กœ ์•ก์…˜ ์‹œํŠธ ์ฐฝ์ด ๋‹ซํžŒ๋‹ค.

  • UIAlertController์—๋Š” ์‚ฌ์šฉ์ž๊ฐ€ ์›ํ•˜๋Š” ๋Œ€๋กœ ๋ฒ„ํŠผ์„ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ๋‹ค. ๋ฒ„ํŠผ์€ UIAlertAction ๊ฐ์ฒด์— ์˜ํ•ด์„œ ๊ตฌํ˜„๋˜๋Š”๋ฐ, ํ•„์š”ํ•œ ๋ฒ„ํŠผ ์ˆ˜๋งŒํผ UIAlertAction ๊ฐ์ฒด๋ฅผ ๊ตฌํ˜„ํ•˜๊ณ , ์ด ๋ฒ„ํŠผ์ด ํด๋ฆญ ๋˜์—ˆ์„ ๋•Œ ์‹คํ–‰ํ•ด์ค„ ์ฝ”๋“œ๋ฅผ ์ธ์ž ๊ฐ’์œผ๋กœ ๋„ฃ์–ด ์ดˆ๊ธฐํ™” ํ•˜๋ฉด ๋œ๋‹ค.

  • UIAlertController๋Š” ํ•˜๋‚˜์˜ ๋ทฐ ์ปจํŠธ๋กค๋Ÿฌ ์ด๊ธฐ ๋–„๋ฌธ์—, ์‹คํ–‰ ์—ญ์‹œ ๋ทฐ ์ปจํŠธ๋กค๋Ÿฌ์— ์˜ํ•œ ํ™”๋ฉด ์ด๋™ ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•ด์•ผํ•œ๋‹ค. ์ฆ‰. ๋˜ ๋‹ค๋ฅธ ํ•˜๋‚˜์˜ ํ™”๋ฉด์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜๊ณ  ํ™”๋ฉด์„ ์ „ํ™˜์‹œ์ผœ ์ฃผ์–ด์•ผํ•œ๋‹ค.๋‹จ, ๋ฒ„ํŠผ์ด ํด๋ฆญ๋˜๋ฉด ์ฐฝ์€ ์ž๋™์œผ๋กœ ๋‹ซํžˆ๊ธฐ ๋–„๋ฌธ์— dismiss(animated:) ๋ฉ”์†Œ๋“œ๋ฅผ ๊ตฌํ˜„ํ•ด ์ค„ ํ•„์š”๋Š” ์—†๋‹ค.

  • ์บ”์Šฌ ํƒ€์ž…์˜ ๋ฒ„ํŠผ์€ ์•ก์…˜์‹œํŠธ์ฐฝ์—์„œ ํ•œ๋ฒˆ ๋ฐ–์— ์“ธ์ˆ˜๊ฐ€ ์—†๋‹ค.

    ์•„๋ž˜์™€ ๊ฐ™์ด ๋”ฑ ํ•œ๊ฐœ์˜ ์š”์†Œ๋งŒ cancel์ฐฝ์—์„œ ๋ถ„๋ฆฌ๋˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

let cancel = UIAlertAction(title: "์ทจ์†Œ", style: .cancel) // ์ทจ์†Œ ๋ฒ„ํŠผ

image-20210405220752799

  • ํ™”๋ฉด์ด ๋œจ์ž๋งˆ์ž ์ž๋™์œผ๋กœ ๋ฉ”์‹œ์ง€ ์ฐฝ์„ ๋„์›Œ์ฃผ์–ด ํ•  ๋•Œ? ๋„คํŠธ์›Œํฌ ๊ธฐ๋ฐ˜ ์„œ๋น„์Šค์—์„œ ๋„คํŠธ์›Œํฌ๊ฐ€ ์—ฐ๊ฒฐ ๋˜์ง€ ์•Š์•˜์„๋•Œ? ์–ด๋–ป๊ฒŒ ์ฐฝ์„ ๋„์›Œ์ค˜์•ผํ•˜๋‚˜??

    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 // ๋‘๋ฒˆ์งธ ํ…์ŠคํŠธ ํ•„๋“œ์ด๊ธฐ ๋–„๋ฌธ์— ๋‘๋ฒˆ์งธ ๋ฐฐ์—ด๋กœ ์ง€์ •ํ•œ๋‹ค.

6.2 ๋กœ์ปฌ ์•Œ๋ฆผ - UserNotification(IOS 10๋ฒ„์ „ ์ด์ƒ๋ถ€ํ„ฐ)

์•ฑ ๋‚ด๋ถ€์—์„œ ๋งŒ๋“  ํŠน์ • ๋ฉ”์‹œ์ง€๋ฅผ iOS์˜ ์•Œ๋ฆผ ์„ผํ„ฐ๋ฅผ ํ†ตํ•ด ์ „๋‹ฌํ•˜๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค. ์•ฑ์ด ์ข…๋ฃŒ ๋˜์–ด ์žˆ๊ฑฐ๋‚˜ ๋ฐฑ๊ทธ๋ผ์šด๋“œ ์ƒํƒœ์ผ๋•Œ ๋ฒ ์‹œ์ง€๋ฅผ ์ „๋‹ฌ ํ•  ์ˆ˜ ์žˆ๋‹ค.

  • UserNotification ์€ UIKit ํ”„๋ ˆ์ž„ ์›Œํฌ์™€ ๋…๋ฆฝ๋œ ํ”„๋ ˆ์ž„์›Œํฌ ์ด๋‹ค. ๋”ฐ๋ผ์„œ ๊ฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ํŒŒ์ผ ์ƒ๋‹จ์— ๋ฐ˜์ž… ๊ตฌ๋ฌธ์„ ์ถ”๊ฐ€ํ•ด์ค˜์•ผํ•œ๋‹ค.
import UserNotification
  • UNMutableNotificationContent : ๋กœ์ปฌ ์•Œ๋ฆผ ํƒ€์ดํ‹€, ์„œ๋ธŒ ํƒ€์ดํ‹€ ๋ฐ ์•Œ๋ฆผ ๋ฉ”์‹œ์ง€๋ฅผ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Œ. ์•ฑ ์•„์ด์ฝ˜์— ํ‘œ์‹œ๋  ๋ฐฐ์ง€๋‚˜ ์‚ฌ์šด๋“œ ์„ค์ • ๋˜ํ•œ ๊ฐ€๋Šฅ

  • UNTimeIntervalNotificationTrigger: ์•Œ๋ฆผ ๋ฐœ์†ก ์กฐ๊ฑด ๊ด€๋ฆฌ, ๋ฐœ์ƒ ์‹œ๊ฐ๊ณผ ๋ฐ˜๋ณต์—ฌ๋ถ€

  • UNNotificationRequest: ์œ„์˜ ๋‘๊ฐ€์ง€ ๊ฐ์ฒด์™€ ์•Œ๋ฆผ ๋ฐœ์†ก ์กฐ๊ฑด ๊ฐ์ฒด๋ฅผ ์ธ์ž ๊ฐ’์œผ๋กœ ํ•˜์—ฌ ๊ทธ ๊ฒฐ๊ณผ๋กœ ์•Œ๋ฆผ ์š”์ฒญ ๊ฐ์ฒด๊ฐ€ ์ƒ์„ฑ๋˜๊ฒŒ ๋œ๋‹ค.

    • UNUserNotificationCenter: ๋ฐœ์†ก์„ ๋‹ด๋‹นํ•˜๋Š” ์„ผํ„ฐ, ์ด ๊ฐ์ฒด๋Š” ์‹ฑ๊ธ€ํ„ด ๋ฐฉ์‹์œผ๋กœ ๋™์ž‘ํ•œ๋‹ค. -> ๋‹ค๋กœ ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•˜์ง€ ์•Š๊ณ  current() ๋ฉ”์†Œ๋“œ๋ฅผ ํ†ตํ•ด ์ฐธ์กฐ ์ •๋ณด๋งŒ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ๋‹ค.

About

๐Ÿ“ฑ IOS๊ฐœ๋ฐœ ๊ณต๋ถ€

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages

AltStyle ใซใ‚ˆใฃใฆๅค‰ๆ›ใ•ใ‚ŒใŸใƒšใƒผใ‚ธ (->ใ‚ชใƒชใ‚ธใƒŠใƒซ) /