๐ŸŽ iOS/Swift

showAlert ๋ฉ”์„œ๋“œ๋Š” ๋น„๋™๊ธฐ ์ฝ”๋“œ์ž…๋‹ˆ๋‹ค. ์ •ํ™•ํžˆ ๋งํ•˜๋ฉด, UIAlertController๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์•Œ๋ฆผ์„ ๋„์šฐ๋Š” ์ž‘์—…์€ ๋น„๋™๊ธฐ์ ์œผ๋กœ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค.  ๋น„๋™๊ธฐ ๋™์ž‘์˜ ๊ฐœ๋…UI ๊ด€๋ จ ์ž‘์—…์˜ ๋น„๋™๊ธฐ์„ฑ:UIAlertController๋ฅผ ํ™”๋ฉด์— ํ‘œ์‹œํ•˜๋Š” ์ž‘์—…์€ ๋น„๋™๊ธฐ์ ์œผ๋กœ ์ฒ˜๋ฆฌ๋ฉ๋‹ˆ๋‹ค. ์ด๋Š” present(_:animated:completion:) ๋ฉ”์„œ๋“œ๊ฐ€ ํ˜ธ์ถœ๋œ ํ›„, ์‚ฌ์šฉ์ž ์ธํ„ฐํŽ˜์ด์Šค(UI)๊ฐ€ ์—…๋ฐ์ดํŠธ๋˜๋Š” ๋ฐฉ์‹๊ณผ ๊ด€๋ จ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ฆ‰, present(_:animated:completion:) ํ˜ธ์ถœ ํ›„ UI๊ฐ€ ์—…๋ฐ์ดํŠธ๋  ๋•Œ๊นŒ์ง€ ์ฝ”๋“œ ์‹คํ–‰์ด ์ผ์‹œ ์ค‘๋‹จ๋˜์ง€ ์•Š๊ณ  ๊ณ„์† ์ง„ํ–‰๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋น„๋™๊ธฐ ๋ฉ”์„œ๋“œ์™€ Completion Handler:UIAlertController์˜ present(_:animated:compl..
UITextFieldUITextField๋Š” ์‚ฌ์šฉ์ž๋กœ๋ถ€ํ„ฐ ํ…์ŠคํŠธ ์ž…๋ ฅ์„ ๋ฐ›์„ ์ˆ˜ ์žˆ๋Š” ์ธํ„ฐํŽ˜์ด์Šค ์š”์†Œ์ด๊ณ , ๋ธ๋ฆฌ๊ฒŒ์ดํŠธ ํŒจํ„ด์€ UITextField์˜ ๋™์ž‘์„ ์ปค์Šคํ„ฐ๋งˆ์ด์ง•ํ•˜๊ณ  ์ด๋ฒคํŠธ๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ๋œ๋‹ค. textField.delegate = self  -> ํ…์ŠคํŠธํ•„๋“œ์˜ ๋Œ€๋ฆฌ์ž๊ฐ€ ๋ทฐ์ปจ์ด ๋จ. ํ…์ŠคํŠธํ•„๋“œ์—์„œ ์ผ์–ด๋‚˜๋Š” ์ผ ์ „๋‹ฌ ๋ฐ›์Œํ…์ŠคํŠธํ•„๋“œ์—์„œ ์–ด๋–ค ์ผ์ด ๋ฐœ์ƒํ•˜๋ฉด ๊ทธ ์‹œ์ ์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ์ „๋‹ฌํ•  ํ…Œ๋‹ˆ ๋ฉ”์„œ๋“œ๋ฅผ ์ฑ„ํƒํ•˜๊ณ  ๊ตฌํ˜„ํ•˜๋ผ.  textField.becomeFirstResponder() //ํ‚ค๋ณด๋“œ ์˜ฌ๋ผ์˜ดtextField.resignFirstResponder() //ํ‚ค๋ณด๋“œ ๋‚ด๋ ค๊ฐ  ์ฃผ์š” UITextField Delegate ๋ฉ”์„œ๋“œ์™€ ์‚ฌ์šฉ ์˜ˆ์ œtextFieldShouldBeginEditing(_:)ํ…์ŠคํŠธ ํ•„๋“œ..
๐Ÿ”Ž  1 . ํ”„๋กœํ† ์ฝœํ”„๋กœํ† ์ฝœ์€ ํŠน์ • ๊ธฐ๋Šฅ์ด๋‚˜ ํŠน์„ฑ์„ ๊ตฌํ˜„ํ•  ๋•Œ ํ•„์š”ํ•œ ๋ฉ”์„œ๋“œ๋‚˜ ํ”„๋กœํผํ‹ฐ์˜ ์ฒญ์‚ฌ์ง„์„ ์ œ๊ณตํ•œ๋‹ค.ํ”„๋กœํ† ์ฝœ์„ ์„ ์–ธํ•  ๋•Œ๋Š” ํ”„๋กœํผํ‹ฐ๋‚˜ ๋ฉ”์„œ๋“œ๋ฅผ ๊ตฌ์ฒด์ ์ธ ๋‚ด์šฉ์ด ์—†๊ณ  ํ˜•ํƒœ๋งŒ ์ œ๊ณตํ•œ๋‹ค.  ๊ตฌ์ฒด์ ์ธ ๋‚ด์šฉ์€ ์ด ํ”„๋กœํ† ์ฝœ์„ ์ฑ„ํƒํ•˜๋Š” ํด๋ž˜์Šค, ๊ตฌ์กฐ์ฒด, ์—ด๊ฑฐํ˜•, extension ๊ฐ์ฒด์—์„œ ๋‹ด๋‹นํ•œ๋‹ค. ํ”„๋กœํ† ์ฝœ์— ์ •์˜๋œ ๋ฉ”์„œ๋“œ์™€ ํ”„๋กœํผํ‹ฐ๋ฅผ ๋ฐ˜๋“œ์‹œ ๊ตฌํ˜„ ํ•œ๋‹ค.  protocol Drawable { var name: String { get } // ์ฝ๊ธฐ ์ „์šฉ ํ”„๋กœํผํ‹ฐ func draw ()}//ํ”„๋กœํ† ์ฝœ ์ฑ„ํƒclass Circle: Drawable { var name: String { //๊ณ„์‚ฐ ํ”„๋กœํผํ‹ฐ return "Circle" } func draw() { ..
์ธ์Šคํ„ด์Šค ๋˜๋Š” ํƒ€์ž…์˜ ๋ถ€๋ถ„์ธ ์ €์žฅ๋œ ๊ฐ’๊ณผ ๊ณ„์‚ฐ๋œ ๊ฐ’์— ์ ‘๊ทผํ•œ๋‹ค. ํด๋ž˜์Šค๋‚˜ ๊ตฌ์กฐ์ฒด์—์„œ ๊ฐ’์„ ์ œ๊ณตํ•˜๋Š” ์—ญํ• ์„ ํ•œ๋‹ค. ํ”„๋กœํผํ‹ฐ๋Š” ๊ฐ’์— ๋Œ€ํ•œ ์ €์žฅ์—ฌ๋ถ€๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์ €์žฅํ”„๋กœํผํ‹ฐ์™€ ๊ณ„์‚ฐํ”„๋กœํผํ‹ฐ๋กœ ๊ตฌ๋ถ„๋œ๋‹ค.  - ํ”„๋กœํผํ‹ฐ์˜ ์œ„์น˜: ํด๋ž˜์Šค์˜ ๋‚ด๋ถ€์—, ๋ฉ”์„œ๋“œ์˜ ์™ธ๋ถ€์— ์ •์˜ํ•œ๋‹ค. ๋ฉ”์„œ๋“œ ๋‚ด๋ถ€๋Š” ํ”„๋กœํผํ‹ฐ๊ฐ€ ์•„๋‹Œ ์ง€์—ญ๋ณ€์ˆ˜.   1. ์ €์žฅํ”„๋กœํผํ‹ฐ ์ƒ์ˆ˜ ๋ฐ ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•ด ์ •์˜ ๊ฐ€๋Šฅํ•˜๋ฉฐ ์ž…๋ ฅ๋œ ๊ฐ’์„ ์ €์žฅํ•˜๊ฑฐ๋‚˜ ์ €์žฅ๋œ ๊ฐ’์„ ์ œ๊ณตํ•˜๋Š” ์—ญํ• . ํด๋ž˜์Šค์™€ ๊ตฌ์กฐ์ฒด์—์„œ๋Š” ์‚ฌ์šฉ๊ฐ€๋Šฅํ•˜์ง€๋งŒ ์—ด๊ฑฐํ˜•์—์„œ๋Š” ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Œ.    1-1. ์ง€์—ฐ ์ €์žฅ ํ”„๋กœํผํ‹ฐ(lazy)lazy ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉฐ, ํ”„๋กœํผํ‹ฐ๊ฐ€ ํ˜ธ์ถœ๋˜๊ธฐ ์ „๊นŒ์ง€๋Š” ์„ ์–ธ๋งŒ ๋  ๋ฟ ์ดˆ๊ธฐํ™” ๋˜์ง€ ์•Š๊ณ  ํ˜ธ์ถœ๋˜๋Š” ์‹œ์ ์— ์ดˆ๊ธฐํ™”๋œ๋‹ค. ์ฒ˜์Œ์œผ๋กœ ํ˜ธ์ถœ๋œ ๊ฐ’์œผ๋กœ ์ดˆ๊ธฐํ™” ๋˜๋ฉฐ, ๊ทธ ๋‹ค์Œ๋ถ€ํ„ฐ ํ˜ธ์ถœ ๋  ๋•Œ๋Š” ์ฒ˜์Œ ์ดˆ..
import UIKitclass SceneDelegate: UIResponder, UIWindowSceneDelegate { var window: UIWindow? // ์•ฑ์„ ์‹œ์ž‘ํ• ๋•Œ ์„ธํŒ…ํ•ด์ค„ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๊ณณ. func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) { // UIWindow ๊ฐ์ฒด ์ƒ์„ฑ. guard let windowScene = (scene as? UIWindowScene) else { return } let window = UIWindow(windowScene: ..
์…€ ์žฌ์‚ฌ์šฉ ๊ฐœ๋…UICollectionView๋Š” ํ™”๋ฉด์— ํ‘œ์‹œ๋˜๋Š” ์…€๋งŒ ๋ฉ”๋ชจ๋ฆฌ์— ์œ ์ง€ํ•˜๊ณ , ํ™”๋ฉด ๋ฐ–์œผ๋กœ ๋‚˜๊ฐ„ ์…€์€์žฌ์‚ฌ์šฉ ํ(reuse queue)์— ๋„ฃ์–ด์„œ ํ•„์š”ํ•  ๋•Œ ๋‹ค์‹œ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ ˆ์•ฝํ•œ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ์Šคํฌ๋กคํ•  ๋•Œ ๋งค๋ฒˆ ์ƒˆ๋กœ์šด ์…€์„ ์ƒ์„ฑํ•˜์ง€ ์•Š์•„๋„ ๋˜์–ด ์„ฑ๋Šฅ์ด ํ–ฅ์ƒ๋œ๋‹ค.  ์…€ ๋“ฑ๋ก ๊ณผ์ •1. ์…€ ํด๋ž˜์Šค ๋“ฑ๋กcollectionView.register(PosterCell.self, forCellWithReuseIdentifier: PosterCell.id) UICollectionView์— ์–ด๋–ค ํƒ€์ž…์˜ ์…€์„ ์‚ฌ์šฉํ• ์ง€ ๋“ฑ๋กํ•ด์•ผ ํ•œ๋‹ค. ์ด๋•Œ, register(_:forCellWithReuseIdentifier:) ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.  2. ์žฌ์‚ฌ์šฉ ์‹๋ณ„์žlet cell = collectionView...
๐Ÿ’ฌ  ์ œ๋„ค๋ฆญ ๋ฌธ๋ฒ•์ด ํ•„์š”ํ•œ ์ด์œ ํƒ€์ž…๋งŒ ๋‹ค๋ฅด๊ณ  ๊ตฌํ˜„ ๋‚ด์šฉ์ด ๋™์ผํ•œ๋ฐ ๊ตณ์ด ํ•จ์ˆ˜๋ฅผ ์ถ”๊ฐ€์ ์œผ๋กœ ๋ฐ˜๋ณตํ•ด์„œ ๋งŒ๋“ค์–ด์•ผํ•  ํ•„์š”๊ฐ€ ์žˆ์„๊นŒ! ์ œ๋„ค๋ฆญ์ด ์—†๋‹ค๋ฉด ํ•จ์ˆ˜(๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ํด๋ž˜์Šค, ๊ตฌ์กฐ์ฒด, ์—ด๊ฑฐํ˜• ๋“ฑ๋„ ๊ฐ€๋Šฅ) ํƒ€์ž…๋งˆ๋‹ค ๋ชจ๋“  ๊ฒฝ์šฐ๋ฅผ ๋‹ค ์ •์˜ํ•ด์•ผํ•ด์„œ ๊ฐœ๋ฐœ์ž์˜ ํ• ์ผ์ด ๋งŽ์•„์ง„๋‹ค. -> ์œ ์ง€๋ณด์ˆ˜/ ์žฌ์‚ฌ์šฉ์„ฑ์ด ์–ด๋ ค์›€ ์ฆ‰, ํ•จ์ˆ˜๋ฅผ ํ•˜๋‚˜๋งŒ ๊ตฌํ˜„ํ•˜๋ฉด ๋‚ด๋ถ€์— ์žˆ๋Š” ํƒ€์ž…์€ ์–ธ์ œ๋“ ์ง€ ๋ฐ”๊ฟ”์„œ ์‚ฌ์šฉ ๊ฐ€๋Šฅ-> ์ œ๋„ค๋ฆญ์ด ์—†๋‹ค๋ฉด ํ•จ์ˆ˜๋ฅผ ๋ชจ๋“  ํƒ€์ž…๋งˆ๋‹ค ๋‹ค์‹œ ์ •์˜ ํ•ด์„œ ์‚ฌ์šฉํ•ด์•ผํ•œ๋‹ค.-> ์—ฌ๋Ÿฌ๋ฒˆ ์ค‘๋ณตํ•ด์„œ ๊ตฌํ˜„ํ•ด์•ผํ•˜๋Š” ํ•„์š”๊ฐ€ ์—†์–ด์ง„๋‹ค.   ํƒ€์ž… ํŒŒ๋ผ๋ฏธํ„ฐ๋Š” ํ•จ์ˆ˜ ๋‚ด๋ถ€์—์„œ ํŒŒ๋ผ๋ฏธํ„ฐ ํ˜•์‹์ด๋‚˜ ๋ฆฌํ„ดํ˜•์œผ๋กœ ์‚ฌ์šฉ๋œ๋‹ค. ํ•จ์ˆ˜ ๋ฐ”๋””์—์„œ ์‚ฌ์šฉ๋„ ๊ฐ€๋Šฅ.๋ณดํ†ต T๋ฅผ ์‚ฌ์šฉํ•˜์ง€๋งŒ ๋‹ค๋ฅธ ์ด๋ฆ„ ์‚ฌ์šฉ๋„ ๊ฐ€๋Šฅ. 2๊ฐœ ์ด์ƒ๋„ ๊ฐ€๋Šฅ.    ๐Ÿ”Ž  1 . ์ œ๋„ค๋ฆญ ํ•จ์ˆ˜ ์ •์˜ํ•จ์ˆ˜ ์ด๋ฆ„ ์˜†์— ..
์ง€๋‚œ ๊ธ€๊ณผ ์ด์–ด์ง€๋Š” ๋งฅ๋ฝ์ด๋‹ค. ์ดˆ๊ธฐํ™” ์ž‘์—…์—์„œ ๋ณผ ์ˆ˜ ์žˆ๋Š” init๊ณผ required init?์ด ๋ฌด์—‡์ธ์ง€ ์•Œ์•„๋ณด์ž.  ๐Ÿ”— https://dkswlgus0314.tistory.com/236 ๐ŸŒŸ 1. init๊ณผ required init? ์— ๋Œ€ํ•ด์„œ๊ธฐ๋ณธ ์ด๋‹ˆ์…œ๋ผ์ด์ € init๊ธฐ๋Šฅ: ์‚ฌ์šฉ์ž ์ •์˜ ์ด๋‹ˆ์…œ๋ผ์ด์ €๋กœ, ํด๋ž˜์Šค๊ฐ€ ์ธ์Šคํ„ด์Šคํ™”๋  ๋•Œ ํ•„์š”ํ•œ ์ดˆ๊ธฐํ™” ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•œ๋‹ค.์‚ฌ์šฉ ์˜ˆ: ์ฃผ๋กœ ํด๋ž˜์Šค ์ธ์Šคํ„ด์Šค๋ฅผ ๋งŒ๋“ค ๋•Œ ์ดˆ๊ธฐ ์ƒํƒœ๋ฅผ ์„ค์ •ํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ๋œ๋‹ค.ํ•„์š”ํ•œ ์†์„ฑ๋“ค์„ ์™ธ๋ถ€์—์„œ ๋ฐ›์•„ ์ดˆ๊ธฐํ™”ํ•  ์ˆ˜ ์žˆ๋‹ค.init(coreDataRepository: CoreDataRepository, mode: PhoneBookMode) { self.coreDataRepository = coreDataRepository self..
AHN.Jihyeon
'๐ŸŽ iOS/Swift' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๊ธ€ ๋ชฉ๋ก