๐ŸŒฑ SeSAC

[SeSAC] 220722 TIL

taeeekki 2022. 7. 26. 09:43

ํ™”๋ฉด ์ „ํ™˜์—์„œ ํ—ท๊ฐˆ๋ฆด๋งŒํ•œ ์ง€์ 

  • ๋„ค๋น„๊ฒŒ์ด์…˜ ์Šคํƒ ๊ด€๋ฆฌ (์ฝ”๋“œ๋กœ ํ™”๋ฉด ์ „ํ™˜์„ ๊ตฌํ˜„ํ•  ๋•Œ ๋†“์น˜๊ธฐ ์‰ฝ๋‹ค.)
  • ๋„ค๋น„๊ฒŒ์ด์…˜ ์Šคํƒ์œผ๋กœ ๊ด€๋ฆฌ๋˜๋‹ค๊ฐ€ ์ค‘๊ฐ„์— Present๋œ ๋ชจ๋‹ฌ์ด ๋‚˜์˜ค๋ฉด ์Šคํƒ์ด ๋Š๊ธฐ๊ฒŒ ๋œ๋‹ค.
  • ์ค‘๊ฐ„์— ์ƒˆ๋กญ๊ฒŒ ๋„ค๋น„๊ฒŒ์ด์…˜ ์ปจํŠธ๋กค๋Ÿฌ๋ฅผ embedํ•ด์„œ ์ „ํ™˜์„ ์ด์–ด๋‚˜๊ฐˆ ์ˆ˜ ์žˆ๊ณ , ์ด ์‹œ์ ๋ถ€ํ„ฐ๋Š” ์ƒˆ๋กœ์šด ๋„ค๋น„๊ฒŒ์ด์…˜ ์Šคํƒ์ด ์ƒ๊ธฐ๊ฒŒ ๋œ๋‹ค.
  • ์‹œ์ž‘์ ์˜ ์ค‘์š”์„ฑ (ํƒญ๋ฐ” ์ปจํŠธ๋กค๋Ÿฌ, ๋„ค๋น„๊ฒŒ์ด์…˜ ์ปจํŠธ๋กค๋Ÿฌ)
  • ์Šคํ† ๋ฆฌ๋ณด๋“œ์— ๋„ค๋น„๊ฒŒ์ด์…˜ ์ปจํŠธ๋กค๋Ÿฌ๋ฅผ embed ํ•ด๋†“๋”๋ผ๋„ ์ธ์Šคํ„ด์Šค๋ฅผ ๊ฐ€์ ธ์˜ฌ ๋•Œ ์ฃผ์˜ํ•˜์ง€ ์•Š์œผ๋ฉด ์›ํ•˜๋Š” ๊ตฌํ˜„์„ ํ•  ์ˆ˜ ์—†๋‹ค.

ํ™”๋ฉด ์ „ํ™˜ํ•˜๋ฉด์„œ ๊ฐ’ ์ „๋‹ฌ

  1. ์ „๋‹ฌ ๋ฐ›์„ ํ™”๋ฉด์— ๊ณต๊ฐ„ ๋งŒ๋“ค๊ธฐ
  2. ๋ฐ์ดํ„ฐ ์ „๋‹ฌํ•˜๊ธฐ
  3. ๋ฐ›์€ ๋ฐ์ดํ„ฐ ๊ฐ€์ง€๊ณ  ๋ทฐ์— ํ‘œํ˜„ํ•˜๊ธฐ
  4. ํ™”๋ฉด ์ „๋‹ฌ ์‹œ ์ ์ ˆํ•˜๊ฒŒ ๋ณ€์ˆ˜์— ๊ฐ’์„ ๋‹ด์•„๋ณด๋‚ด๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋‹ค์šด ์บ์ŠคํŒ…์ด ํ•„์š”ํ•˜๋‹ค. (์šฐ๋ฆฌ๊ฐ€ ViewController ์•ˆ์— ๋งŒ๋“ค์–ด ๋†“์€ ๋ณ€์ˆ˜์— ์ ‘๊ทผํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋‹น์—ฐํ•˜๊ฒŒ๋„ ํƒ€์ž… ์บ์ŠคํŒ…์ด ํ•„์š”ํ•˜๊ฒŒ ๋œ๋‹ค.)
  5. ์•„์›ƒ๋ ›์ด ๋งŒ๋“ค์–ด์ง€๋Š” ์‹œ์ ์ด ์ดˆ๊ธฐํ™”๋˜๋Š” ์‹œ์ ๋ณด๋‹ค ๋” ๋‚˜์ค‘์ด๊ธฐ ๋•Œ๋ฌธ์— ๊ทธ ์ „์— ์ ‘๊ทผํ•˜๋ ค๊ณ  ํ•˜๋ฉด ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.

์—๋Ÿฌ ์ฒดํฌ

  • UIButton์˜ Style์ด plain์ด๋ฉด currentTitle์— ์ ‘๊ทผํ•  ์ˆ˜ ์—†๋‹ค.

์˜ต์…”๋„ ๊ฐ’ ์ฒดํฌ

var placeholder: String?

self.userTextField.placeholder = placeholder
self.userTextField.placeholder = "\(placeholder ?? "nil value")"

๋”ฐ๋กœ ๋”ฐ๋กœ ํ”„๋กœํผํ‹ฐ ์ƒ์„ฑํ•˜์ง€ ์•Š๊ณ , ํ•˜๋‚˜์˜ ๊ตฌ์กฐ์ฒด ์ „์ฒด๋ฅผ ์ „๋‹ฌ ๋ฐ›๋Š” ๊ฒƒ์ด ๋‚˜์€ ์ด์œ 

var movieData: Movie?
  • ๋ฐ์ดํ„ฐ ๋ณ€๊ฒฝ(์ถ”๊ฐ€, ์‚ญ์ œ)๋“ฑ์— ๋Œ€์ฒ˜ํ•˜๊ธฐ ์‰ฝ๋‹ค.

์‹œ์ž‘ ํ™”๋ฉด์˜ ๋ณ€๊ฒฝ

์•ฑ์„ ์‚ฌ์šฉํ•  ๋•Œ๋งˆ๋‹ค ๋กœ๊ทธ์ธ/ํšŒ์›๊ฐ€์ž…/์ธํŠธ๋กœ ํ™”๋ฉด์ด ๊ณ„์†ํ•ด์„œ ๋‚˜์˜จ๋‹ค๋ฉด ์‚ฌ์šฉ์ž ์ž…์žฅ์—์„œ ๋งŽ์ด ๋ถˆํŽธํ•  ๊ฒƒ์ด๋‹ค. ๋”ฐ๋ผ์„œ ์ด ๋ถ€๋ถ„์— ๋Œ€ํ•œ ํ•ด์†Œ๊ฐ€ ํ•„์š”ํ•˜๋‹ค.

  1. ๋กœ๊ทธ์ธ ํ™”๋ฉด
  • ๊ธฐ์‚ฌ์šฉ์ž : ๋ฉ”์ธํ™”๋ฉด
  • ์ตœ์ดˆ ๊ฐ€์ž…์ž : ๋กœ๊ทธ์ธ/ํšŒ์›๊ฐ€์ž… ํ™”๋ฉด
  1. toss
  • ์ธํŠธ๋กœ ํ™”๋ฉด
  • ์˜จ๋ณด๋”ฉ ํ™”๋ฉด
  • ํŠœํ† ๋ฆฌ์–ผ ํ™”๋ฉด

UIWindow

  • ์ˆ˜๋งŽ์€ ํ™”๋ฉด ์ค‘์—์„œ ์–ด๋–ค ๊ฒƒ์„ ์•„์ดํฐ ํ™”๋ฉด์— ๋ณด์—ฌ์ค„ ์ง€ ๊ด€๋ฆฌํ•˜๋Š” ๊ฐ์ฒด
// ์‹œ์ž‘ ํ™”๋ฉด์„ ์—ฐ๊ฒฐํ•˜๊ธฐ ์ „์— ํ•ด๋‹น ๋ฉ”์„œ๋“œ์—์„œ ํ†ต์ œ
func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {

    guard let scene = (scene as? UIWindowScene) else { return }
    self.window = UIWindow(windowScene: scene)
    
    let sb = UIStoryboard(name: "Trend", bundle: nil)
    guard let vc = sb.instantiateViewController(withIdentifier: "ViewController") as? ViewController else { return }
    
    self.window?.rootViewController = vc
    self.window?.makeKeyAndVisible()
}

์‹œ์ž‘ ํ™”๋ฉด ๋ถ„๊ธฐ ์ฒ˜๋ฆฌ

func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
    
    guard let scene = (scene as? UIWindowScene) else { return }
    self.window = UIWindow(windowScene: scene)
    
    UserDefaults.standard.set(false, forKey: "First")
    
    // true์ด๋ฉด ViewController, false์ด๋ฉด SearchTableViewController
    if UserDefaults.standard.bool(forKey: "First") {
        let sb = UIStoryboard(name: "Trend", bundle: nil)
        guard let vc = sb.instantiateViewController(withIdentifier: "ViewController") as? ViewController else { return }
        self.window?.rootViewController = vc // ์–ด๋–ค ๋ทฐ ์ปจํŠธ๋กค๋Ÿฌ๋ฅผ ๋ณด์—ฌ์ฃผ๊ฒ ๋‹ค.
    } else {
        let sb = UIStoryboard(name: "Search", bundle: nil)
        guard let vc = sb.instantiateViewController(withIdentifier: "SearchTableViewController") as? SearchTableViewController else { return }
        self.window?.rootViewController = vc // ์–ด๋–ค ๋ทฐ ์ปจํŠธ๋กค๋Ÿฌ๋ฅผ ๋ณด์—ฌ์ฃผ๊ฒ ๋‹ค.
    }

    self.window?.makeKeyAndVisible()     // Window๊ฐ€ ๋ทฐ ์ปจํŠธ๋กค๋Ÿฌ๋ฅผ ํ™”๋ฉด์— ๋น„์ถฐ์ฃผ๋Š” ์—ญํ• 
}

๋กœ๊ทธ์•„์›ƒ (์ฒซ ํ™”๋ฉด์œผ๋กœ ๋Œ์•„๊ฐ€๊ณ  ์‹ถ์„ ๋•Œ, ์ฒ˜์Œ๋ถ€ํ„ฐ ์‹œ์ž‘ํ•˜๊ณ  ์‹ถ์„ ๋•Œ)

  1. ์ฒซ ํ™”๋ฉด์œผ๋กœ ์ „ํ™˜ (๊ธฐ๋ณธ์ ์ธ ํ™”๋ฉด ์ „ํ™˜ ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•˜๋ฉด ์•ˆ ๋จ - push/present)
  2. ๋ฐ์ดํ„ฐ ์ดˆ๊ธฐํ™” (UserDefault ๋ฐ์ดํ„ฐ ์ดˆ๊ธฐํ™”)
  • ํ…Œ๋งˆ ๋ฐ”๊ฟ€ ๋•Œ
  • ์‚ฌ์šฉ์ž๊ฐ€ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณต๊ตฌํ–ˆ์„ ๋•Œ
  • ํ•™์ƒ ๋ชจ๋“œ/ํŠœํ„ฐ ๋ชจ๋“œ -> ์‚ฌ์šฉ์ž ์ „ํ™˜ ์‹œ
@objc func resetButtonClicked() {
    // ์‹œ์ž‘ ํ™”๋ฉด ์ดˆ๊ธฐํ™”
    // iOS 13.0+ SceneDelegate ์“ธ ๋•Œ ๋™์ž‘ํ•˜๋Š” ์ฝ”๋“œ
    // ๊ธฐ์กด์— ์Œ“์—ฌ์žˆ๋˜ ํ™”๋ฉด๋“ค์€ ๋ฉ”๋ชจ๋ฆฌ์—์„œ ์ „๋ถ€ ๋‚ด๋ ค๊ฐ€๊ฒŒ ๋œ๋‹ค.
    // ์•ฑ์˜ ์ƒํƒœ๋ฅผ ๋ฐ”๊ฟ€ ๋•Œ window๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ํŽธ์ด๋‹ค.
    
    let windowScene = UIApplication.shared.connectedScenes.first as? UIWindowScene
    let sceneDelegate = windowScene?.delegate as? SceneDelegate
    
    let sb = UIStoryboard(name: "Trend", bundle: nil)
    guard let vc = sb.instantiateViewController(withIdentifier: "ViewController") as? ViewController else { return }

    sceneDelegate?.window?.rootViewController = vc
    sceneDelegate?.window?.makeKeyAndVisible()
}