Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
64 commits
Select commit Hold shift + click to select a range
ad2aa38
ํ”„๋กœ์ ํŠธ ํŒŒ์ผ ์ƒ์„ฑ
coduhee Mar 11, 2026
778568b
Package Dependencies ์„ค์น˜
coduhee Mar 12, 2026
f7f6f46
โœจfeat: Folder ๊ตฌ์กฐ ์ •๋ฆฌ
coduhee Mar 12, 2026
f818f5b
โœจfeat: ์•ฑ ์ „์ฒด์—์„œ ๊ณตํ†ต์œผ๋กœ ์“ธ ๋ชจ๋ธ ContentItem ์ƒ์„ฑ
coduhee Mar 12, 2026
b981169
โœจfeat: ํ™ˆ ํ™”๋ฉด ์„น์…˜ ๋ชจ๋ธ HomeSection ์ƒ์„ฑ
coduhee Mar 12, 2026
5d0fcae
โœจFeat: ListCollectionViewCell ๊ตฌํ˜„
coduhee Mar 14, 2026
0e0d914
โœจFeat: HomeCollectionViewCell ๊ตฌํ˜„
coduhee Mar 14, 2026
a5a2a23
๐ŸŽจ Art: Layout ์ˆ˜์ •
coduhee Mar 15, 2026
d3a5907
๐Ÿ”ฅFire: HomeCollectionViewCell -> CardCollectionViewCell ์ด๋ฆ„ ๋ณ€๊ฒฝ
coduhee Mar 15, 2026
d751a7d
โœจFeat: HomeSectionHeaderView ๊ตฌํ˜„
coduhee Mar 15, 2026
f7a34d4
โœจFeat: HomeViewController ๊ตฌํ˜„
coduhee Mar 15, 2026
0d0aea5
โœจFeat: HomeReactor ๊ตฌํ˜„
coduhee Mar 15, 2026
0ce646b
โœจFeat: SceneDelegate์— HomeViewController() ์—ฐ๊ฒฐ
coduhee Mar 15, 2026
af6c6ba
โœจFeat: FetchHomeContentUseCase ๊ตฌํ˜„
coduhee Mar 15, 2026
2088b40
โœจFeat: APIEndpoint ๊ตฌํ˜„
coduhee Mar 15, 2026
14b8ef2
โœจFeat: NetworkManager ๊ตฌํ˜„
coduhee Mar 15, 2026
5c8d2c6
โœจFeat: ItunesResponseDTO ๊ตฌํ˜„
coduhee Mar 15, 2026
696d5f1
โœจFeat: Extensions ๊ตฌํ˜„
coduhee Mar 15, 2026
aaada90
โœจFeat: SearchRepository ๊ตฌํ˜„
coduhee Mar 15, 2026
18cb5f8
โœจFeat: SearchRepositoryType Protocol ๊ตฌํ˜„
coduhee Mar 15, 2026
a593533
โœจFeat: SPM(Kingfisher, ReactorKit) ์ถ”๊ฐ€
coduhee Mar 15, 2026
5720b94
โ™ป๏ธRefactor: fetchMusic ์‚ญ์ œ -> fetchContent๋กœ ํ†ตํ•ฉ
coduhee Mar 15, 2026
42318e1
โ™ป๏ธRefactor: #Preview ์ˆ˜์ •, identifier ๋„ค์ด๋ฐ ์ˆ˜์ •
coduhee Mar 15, 2026
5e44004
โœจFeat: HomeSection์— RxDataSources ๊ตฌํ˜„์œ„ํ•ด ์ถ”๊ฐ€ ๊ธฐ๋Šฅ ๊ตฌํ˜„
coduhee Mar 15, 2026
958f151
โœจFeat: RxDataSources๋กœ ๋กœ์ง ์—…๋ฐ์ดํŠธ
coduhee Mar 15, 2026
7da01e8
โ™ป๏ธRefactor: viewDidLoad -> bind(reactor:)์•ˆ์— Rx๋กœ ๋ฌถ์–ด๋‘๊ธฐ
coduhee Mar 16, 2026
9457b5d
โœจFeat: ์•จ๋ฒ” ์‚ฌ์ง„ ๊ณ ํ™”์งˆ๋กœ ํฌ๊ธฐ ๋ณ€ํ™˜
coduhee Mar 16, 2026
2e9b041
๐ŸžFix: CollectionViewCell ๋ฒ„๊ทธ ์ˆ˜์ •
coduhee Mar 16, 2026
b16ca5d
โ™ป๏ธRefactor: ์ด๋ฏธ์ง€ ํฌ๊ธฐ ์กฐ์ •
coduhee Mar 16, 2026
62e376f
โœจFeat: RxDataSources ํŒจํ‚ค์ง€ ์ถ”๊ฐ€
coduhee Mar 16, 2026
ecb0b5d
โ™ป๏ธRefactor: 30 -> 10 ๊ฐœ์”ฉ ์ถ”์ถœ
coduhee Mar 16, 2026
fc90910
โ™ป๏ธRefactor: 300x300์œผ๋กœ ์ด๋ฏธ์ง€ ํฌ๊ธฐ ์กฐ์ •
coduhee Mar 16, 2026
ed79153
โ™ป๏ธRefactor: NetworkManager ์‹ฑ๊ธ€ํ†ค ํŒจํ„ด์œผ๋กœ ๋ณ€๊ฒฝ
coduhee Mar 17, 2026
9052723
โ™ป๏ธRefactor: Error ํƒ€์ž… ์ •์˜
coduhee Mar 17, 2026
cd3a644
โœจFeat: SearchUseCase ๊ตฌํ˜„
coduhee Mar 17, 2026
d750ab9
โœจFeat: Extension ์‚ฌ์ง„์˜ ํ‰๊ท  ์ƒ‰์ƒ ์ถ”์ถœํ•˜๋Š” ํ•จ์ˆ˜
coduhee Mar 17, 2026
fe8aab5
โ™ป๏ธRefactor: UI ์กฐ์ •, ํ”„๋ฆฌ๋ทฐ ์‚ญ์ œ
coduhee Mar 17, 2026
c97b21c
๐ŸžFix: movie -> musicVideo ๋ฐ์ดํ„ฐ ๋ณ€๊ฒฝ
coduhee Mar 17, 2026
4fa90e3
โ™ป๏ธRefactor: ํ‰๊ท  ์ƒ‰์ƒ ์ถ”์ถœ ํ•จ์ˆ˜ ์‚ญ์ œ
coduhee Mar 18, 2026
6f668af
โ™ป๏ธRefactor: country, limit ๋ณ€์ˆ˜ mediaType๋ณ„๋กœ ์ปค์Šคํ…€ํ•˜๊ฒŒ ์„ค์ •
coduhee Mar 18, 2026
281d108
โœจFeat: M/V URL ์ถ”์ถœ ๊ธฐ๋Šฅ ์ถ”๊ฐ€
coduhee Mar 18, 2026
02f4d4c
โœจFeat: ellipsis Button ๊ตฌํ˜„
coduhee Mar 18, 2026
bdb008a
โ™ป๏ธReactor: SceneDelegate ์ˆ˜์ •
coduhee Mar 18, 2026
bc647db
โœจFeat: SearchViewController ๊ตฌํ˜„
coduhee Mar 18, 2026
0863cd7
โœจFeat: SearchReactor ๊ตฌํ˜„
coduhee Mar 18, 2026
661632d
โœจFeat: SearchCollectionViewCell ๊ตฌํ˜„
coduhee Mar 18, 2026
8a48093
โœจFeat: SearchCellReactor ๊ตฌํ˜„
coduhee Mar 18, 2026
ece79b4
โ™ป๏ธReactor: HomeVC ๋ฆฌํŒฉํ† ๋ง
coduhee Mar 18, 2026
238539a
โœจFeat: ๊ฐ’ ๋น„๊ต๋ฅผ ์œ„ํ•ด Equatable ํ”„๋กœํ† ์ฝœ ์ถ”๊ฐ€
coduhee Mar 18, 2026
0900571
โ™ป๏ธReactor: errorMessage @Pulse ์ถ”๊ฐ€
coduhee Mar 18, 2026
f67038b
๐ŸžFix: playerLayer ์„ ์–ธ ๋ฒ„๊ทธ ์ˆ˜์ •
coduhee Mar 18, 2026
81aeeb8
๐Ÿ“ฆ ํŒŒ์ผ์ด๋™
coduhee Mar 18, 2026
0812811
๐ŸžBug: imageContainerView ์‚ญ์ œ
coduhee Mar 18, 2026
7a02ddd
โœจFeat: AudioManager Singleton ํŒจํ„ด ๊ตฌํ˜„
coduhee Mar 18, 2026
b0e088f
โœจFeat: PlayableUICell ํ”„๋กœํ† ์ฝœ ๊ตฌํ˜„
coduhee Mar 18, 2026
57ef84e
โœจFeat: Audio ์žฌ์ƒ UI ๊ตฌํ˜„
coduhee Mar 18, 2026
b0e16df
โœจFeat: ์Œ์› ์žฌ์ƒ ReactoKit ํŒจํ„ด ๊ตฌํ˜„
coduhee Mar 18, 2026
5ce0268
โœจFeat: VC ์Œ์›์žฌ์ƒ bind ํ•จ์ˆ˜ ๋‚ด๋ถ€ ๊ตฌํ˜„
coduhee Mar 18, 2026
2945952
โ™ป๏ธRefactor: searchController ์˜์กด์„ฑ ์ฃผ์ž…
coduhee Mar 18, 2026
d233d57
โ™ป๏ธRefactor: ๋“ค์—ฌ์“ฐ๊ธฐ ์ˆ˜์ •
coduhee Mar 18, 2026
17a05cf
โ™ป๏ธRefactor: url์ด ์œ ํšจํ• ๋•Œ๋งŒ ์žฌ์ƒ ์ด๋ฏธ์ง€ ์ ์šฉ
coduhee Mar 18, 2026
3cfe5ec
๐ŸžFix: ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜ ๋””๋ฒ„๊น…
coduhee Mar 19, 2026
6d8f2cf
โ™ป๏ธRefactor: AVPlayer->VC ๋‹จ์ผ ๊ฐ์ฒด๋กœ
coduhee Mar 19, 2026
7f464f0
โ™ป๏ธRefactor: prepareReuse์— ์žฌ์ƒ UI ์ดˆ๊ธฐํ™” ์ถ”๊ฐ€
coduhee Mar 19, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
504 changes: 504 additions & 0 deletions Challenge/Challenge.xcodeproj/project.pbxproj

Large diffs are not rendered by default.

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

25 changes: 25 additions & 0 deletions Challenge/Challenge/Base.lproj/LaunchScreen.storyboard
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="13122.16" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" launchScreen="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES" initialViewController="01J-lp-oVM">
<dependencies>
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="13104.12"/>
<capability name="Safe area layout guides" minToolsVersion="9.0"/>
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
</dependencies>
<scenes>
<!--View Controller-->
<scene sceneID="EHf-IW-A2E">
<objects>
<viewController id="01J-lp-oVM" sceneMemberID="viewController">
<view key="view" contentMode="scaleToFill" id="Ze5-6b-2t3">
<rect key="frame" x="0.0" y="0.0" width="375" height="667"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<color key="backgroundColor" xcode11CocoaTouchSystemColor="systemBackgroundColor" cocoaTouchSystemColor="whiteColor"/>
<viewLayoutGuide key="safeArea" id="6Tk-OE-BBY"/>
</view>
</viewController>
<placeholder placeholderIdentifier="IBFirstResponder" id="iYj-Kq-Ea1" userLabel="First Responder" sceneMemberID="firstResponder"/>
</objects>
<point key="canvasLocation" x="53" y="375"/>
</scene>
</scenes>
</document>
48 changes: 48 additions & 0 deletions Challenge/Challenge/Extensions/Extensions.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
//
// UIImageView+Extension.swift
// Challenge
//
// Created by ๊น€์ฃผํฌ on 3/15/26.
//

import UIKit
import Kingfisher


// MARK: - loadImage
extension UIImageView {

func loadImage(from urlString: String) {
guard let url = URL(string: urlString) else {
self.image = nil
return
}

self.kf.setImage(
with: url,
placeholder: nil,
options: [
.transition(.fade(0.2)), // ๋ถ€๋“œ๋Ÿฝ๊ฒŒ ์ด๋ฏธ์ง€ ํŽ˜์ด๋“œ ์ธ
.cacheOriginalImage // ์›๋ณธ ์ด๋ฏธ์ง€๋ฅผ ์บ์‹œ์— ์ €์žฅ
]
)
}
}


// MARK: - Alert
extension UIViewController {

func showErrorAlert(message: String) {
let alert = UIAlertController(
title: "์—๋Ÿฌ",
message: message,
preferredStyle: .alert
)

let okAction = UIAlertAction(title: "ํ™•์ธ", style: .default)
alert.addAction(okAction)

present(alert, animated: true)
}
}
28 changes: 28 additions & 0 deletions Challenge/Challenge/Managers/AudioManager.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
//
// AudioManager.swift
// Challenge
//
// Created by ๊น€์ฃผํฌ on 3/18/26.
//

import AVFoundation

final class AudioManager {

static let shared = AudioManager()

private init() {}

private var player: AVPlayer?

func play(url: URL) {
player?.pause() // ์ผ๋‹จ ์žฌ์ƒ๋˜๋˜ ๋…ธ๋ž˜๋Š” ๊บผ์•ผ ์•ˆ๊ฒน์นจ

player = AVPlayer(url: url)
player?.play()
}

func play() {
player?.play()
}
}
Comment on lines +10 to +28

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

high

AudioManager๊ฐ€ ์‹ฑ๊ธ€ํ†ค์œผ๋กœ ๊ตฌํ˜„๋˜์–ด ์žˆ์–ด ์•ฑ์˜ ๋‹ค๋ฅธ ๋ถ€๋ถ„๊ณผ ๊ฐ•ํ•˜๊ฒŒ ๊ฒฐํ•ฉ๋ฉ๋‹ˆ๋‹ค. ์ด๋Š” ์œ ๋‹› ํ…Œ์ŠคํŠธ๋ฅผ ์–ด๋ ต๊ฒŒ ๋งŒ๋“ค๊ณ , ์˜ค๋””์˜ค ์žฌ์ƒ ๋กœ์ง์„ ๋‹ค๋ฅธ ๊ตฌํ˜„์œผ๋กœ ๊ต์ฒดํ•˜๊ธฐ ์–ด๋ ต๊ฒŒ ๋งŒ๋“ญ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, HomeViewController๋‚˜ SearchViewController๋ฅผ ํ…Œ์ŠคํŠธํ•  ๋•Œ ์‹ค์ œ AVPlayer์— ์˜์กดํ•˜๊ฒŒ ๋˜์–ด ํ…Œ์ŠคํŠธ๊ฐ€ ๋ณต์žกํ•ด์ง€๊ณ  ๋А๋ ค์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜์กด์„ฑ ์ฃผ์ž…(Dependency Injection)์„ ์‚ฌ์šฉํ•˜์—ฌ ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

  1. AudioManagerType ํ”„๋กœํ† ์ฝœ์„ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค.
  2. AudioManager๊ฐ€ ์ด ํ”„๋กœํ† ์ฝœ์„ ์ค€์ˆ˜ํ•˜๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.
  3. SceneDelegate์—์„œ AudioManager ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•˜๊ณ , ์ด๋ฅผ ํ•„์š”๋กœ ํ•˜๋Š” ๋ทฐ ์ปจํŠธ๋กค๋Ÿฌ์˜ ์ƒ์„ฑ์ž๋ฅผ ํ†ตํ•ด ์ฃผ์ž…ํ•ฉ๋‹ˆ๋‹ค.

์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ํ…Œ์ŠคํŠธ ์‹œ์—๋Š” ์‹ค์ œ AudioManager ๋Œ€์‹  ์˜ค๋””์˜ค ์žฌ์ƒ ๋™์ž‘์„ ํ‰๋‚ด ๋‚ด๋Š” ๊ฐ€์งœ ๊ฐ์ฒด(mock object)๋ฅผ ์ฃผ์ž…ํ•˜์—ฌ, ๋ทฐ ์ปจํŠธ๋กค๋Ÿฌ์˜ ๋กœ์ง์„ ๋…๋ฆฝ์ ์œผ๋กœ ํ…Œ์ŠคํŠธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

References
  1. ์ง์ ‘์ ์ธ ์ „์—ญ/๊ณต์œ  ์˜์กด์„ฑ ์‚ฌ์šฉ์€ ํ…Œ์ŠคํŠธ ์šฉ์ด์„ฑ๊ณผ ์œ ์—ฐ์„ฑ์„ ํฌ๊ฒŒ ์ €ํ•ดํ•  ๋•Œ P1(high)์œผ๋กœ ๋ถ„๋ฅ˜๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์‹ฑ๊ธ€ํ†ค ํŒจํ„ด์€ ์ „์—ญ ์ƒํƒœ์— ๋Œ€ํ•œ ์˜์กด์„ฑ์„ ๋งŒ๋“ค์–ด ์œ ๋‹› ํ…Œ์ŠคํŠธ๋ฅผ ์–ด๋ ต๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค. (link)

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

์ผ๋ถ€๋Ÿฌ ์‹ฑ๊ธ€ํ†ค์œผ๋กœ ํ•œ๊ฑฐ์ž„

10 changes: 10 additions & 0 deletions Challenge/Challenge/Managers/Protocols.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
//
// Untitled.swift
// Challenge
//
// Created by ๊น€์ฃผํฌ on 3/18/26.
//

protocol PlayableUICell {
func updatePlayUI(isPlaying: Bool)
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
{
"colors" : [
{
"idiom" : "universal"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
{
"images" : [
{
"idiom" : "universal",
"platform" : "ios",
"size" : "1024x1024"
},
{
"appearances" : [
{
"appearance" : "luminosity",
"value" : "dark"
}
],
"idiom" : "universal",
"platform" : "ios",
"size" : "1024x1024"
},
{
"appearances" : [
{
"appearance" : "luminosity",
"value" : "tinted"
}
],
"idiom" : "universal",
"platform" : "ios",
"size" : "1024x1024"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
6 changes: 6 additions & 0 deletions Challenge/Challenge/Resources/Assets.xcassets/Contents.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
{
"info" : {
"author" : "xcode",
"version" : 1
}
}
23 changes: 23 additions & 0 deletions Challenge/Challenge/Resources/Info.plist
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>UIApplicationSceneManifest</key>
<dict>
<key>UIApplicationSupportsMultipleScenes</key>
<false/>
<key>UISceneConfigurations</key>
<dict>
<key>UIWindowSceneSessionRoleApplication</key>
<array>
<dict>
<key>UISceneConfigurationName</key>
<string>Default Configuration</string>
<key>UISceneDelegateClassName</key>
<string>$(PRODUCT_MODULE_NAME).SceneDelegate</string>
</dict>
</array>
</dict>
</dict>
</dict>
</plist>
36 changes: 36 additions & 0 deletions Challenge/Challenge/Sources/Application/AppDelegate.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
//
// AppDelegate.swift
// Challenge
//
// Created by ๊น€์ฃผํฌ on 3/11/26.
//

import UIKit

@main
class AppDelegate: UIResponder, UIApplicationDelegate {



func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
// Override point for customization after application launch.
return true
}

// MARK: UISceneSession Lifecycle

func application(_ application: UIApplication, configurationForConnecting connectingSceneSession: UISceneSession, options: UIScene.ConnectionOptions) -> UISceneConfiguration {
// Called when a new scene session is being created.
// Use this method to select a configuration to create the new scene with.
return UISceneConfiguration(name: "Default Configuration", sessionRole: connectingSceneSession.role)
}

func application(_ application: UIApplication, didDiscardSceneSessions sceneSessions: Set<UISceneSession>) {
// Called when the user discards a scene session.
// If any sessions were discarded while the application was not running, this will be called shortly after application:didFinishLaunchingWithOptions.
// Use this method to release any resources that were specific to the discarded scenes, as they will not return.
}


}

79 changes: 79 additions & 0 deletions Challenge/Challenge/Sources/Application/SceneDelegate.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,79 @@
//
// SceneDelegate.swift
// Challenge
//
// Created by ๊น€์ฃผํฌ on 3/11/26.
//

import UIKit
import ReactorKit

class SceneDelegate: UIResponder, UIWindowSceneDelegate {

var window: UIWindow?


func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {

guard let windowScene = (scene as? UIWindowScene) else { return }

// ์˜์กด์„ฑ ์ƒ์„ฑ
let repository = SearchRepository()
let fetchHomeContentsuseCase = FetchHomeContentUseCase(repository: repository)
let homereactor = HomeReactor(fetchHomeContentsUseCase: fetchHomeContentsuseCase)

let searchUseCase = SearchUseCase(repository: repository)
let searchReactor = SearchReactor(searchUseCase: searchUseCase)

let searchVC = SearchViewController()
searchVC.reactor = searchReactor

let searchController = UISearchController(searchResultsController: searchVC)
searchController.searchBar.placeholder = "M/V, music, podcast ๊ฒ€์ƒ‰"
searchController.obscuresBackgroundDuringPresentation = false
searchController.searchBar.autocorrectionType = .no // ์ž๋™์™„์„ฑ ๊ธฐ๋Šฅ off
searchController.searchBar.returnKeyType = .search


// ์˜์กด์„ฑ ์ฃผ์ž…
let homeVC = HomeViewController(reactor: homereactor, searchController: searchController)

let navigationController = UINavigationController(rootViewController: homeVC)

let window = UIWindow(windowScene: windowScene)
window.rootViewController = navigationController
window.makeKeyAndVisible()
self.window = window
}

func sceneDidDisconnect(_ scene: UIScene) {
// Called as the scene is being released by the system.
// This occurs shortly after the scene enters the background, or when its session is discarded.
// Release any resources associated with this scene that can be re-created the next time the scene connects.
// The scene may re-connect later, as its session was not necessarily discarded (see `application:didDiscardSceneSessions` instead).
}

func sceneDidBecomeActive(_ scene: UIScene) {
// Called when the scene has moved from an inactive state to an active state.
// Use this method to restart any tasks that were paused (or not yet started) when the scene was inactive.
}

func sceneWillResignActive(_ scene: UIScene) {
// Called when the scene will move from an active state to an inactive state.
// This may occur due to temporary interruptions (ex. an incoming phone call).
}

func sceneWillEnterForeground(_ scene: UIScene) {
// Called as the scene transitions from the background to the foreground.
// Use this method to undo the changes made on entering the background.
}

func sceneDidEnterBackground(_ scene: UIScene) {
// Called as the scene transitions from the foreground to the background.
// Use this method to save data, release shared resources, and store enough scene-specific state information
// to restore the scene back to its current state.
}


}

Loading