- Kyo์ Baem๊ฐ ๋ง๋ Diary App์ ๋๋ค.
- ํ
์คํธ ๊ธฐ๋ฅ์ ๊ตฌํ ํ ๋, ์์ดํฐ
๋ฉ๋ชจ
์ฑ์ ํ ์คํธ ์ ๋ ฅ ๋ก์ง์ ์ฐธ๊ณ ํ์์ต๋๋ค.
- ํ ์๊ฐ
- GroundRule
- Code Convention
- ์คํ ํ๋ฉด
- ํด๋ ๊ตฌ์กฐ
- ํ์๋ผ์ธ
- ๊ธฐ์ ์ ๋์
- ํธ๋ฌ๋ธ ์ํ ๋ฐ ๊ณ ๋ฏผ
- ์ฐธ๊ณ ๋งํฌ
Kyo | Baem |
---|---|
ํผ์ณ๋ณด๊ธฐ
๋ฏธ ์ ๋ ฅ | ์ผ๊ธฐ์์ฑ | Background ์ง์ ์ ์ ์ฅ |
---|---|---|
ActivityController๊ตฌํ | ์ค์์ดํ์ญ์ | ์ผ๊ธฐ๋ด์์ ์ญ์ |
ํผ์ณ๋ณด๊ธฐ
CLLocation์ ์ฌ์ฉ | Cell์ฐ๊ทธ๋ฌ์ง ๊ฐ์ |
---|---|
AttributeString์ปค์์ด๋ ๋ณด์ | DarkMode |
โโโ Diary
โย ย โโโ AppDelegate.swift
โย ย โโโ SceneDelegate.swift
โย ย โโโ Info.plist
โย ย โโโ Base.lproj
โย ย โย ย โโโ LaunchScreen.storyboard
โย ย โโโ Constant
โย ย โย ย โโโ Error.swift
โย ย โโโ Extensions
โย ย โย ย โโโ Formatter+Extension.swift
โย ย โย ย โโโ NSMutableAttributedString+Extension.swift
โย ย โย ย โโโ UIComponent+Extension.swift
โย ย โย ย โโโ UIViewController+Extension.swift
โย ย โโโ Models
โย ย โย ย โโโ CoreData
โย ย โย ย โย ย โโโ CoreDataManager.swift
โย ย โย ย โโโ CurrentDiary.swift
โย ย โย ย โโโ CurrentWeather.swift
โย ย โย ย โโโ DecoderManager.swift
โย ย โย ย โโโ Network
โย ย โย ย โโโ NetworkManager.swift
โย ย โย ย โโโ NetworkRequest.swift
โย ย โย ย โโโ WeatherAPIData.swift
โย ย โโโ Views
โย ย | โโโ CustomListCell.swift
โย ย | โโโ EditDiaryView.swift
โย ย | โโโ MainDiaryView.swift
โย ย โโโ Controllers
โย ย โย ย โโโ EditViewController.swift
โย ย โย ย โโโ MainViewController.swift
โย ย โโโ MappingModelV2ToV3.xcmappingmodel
โย ย โย ย โโโ xcmapping.xml
โย ย โโโDiary.xcdatamodeld
โย ย ย ย โโโ Diary.xcdatamodel
โย ย ย ย โย ย โโโ contents
โย ย ย ย โโโ Diary_v2.xcdatamodel
โย ย ย ย โย ย โโโ contents
โย ย ย ย โโโ Diary_v3.xcdatamodel
โย ย ย ย โย ย โโโ contents
โย ย ย ย โโโ MappingModelV2ToV3.xcmappingmodel
โย ย ย ย โโโ xcmapping.xml
โโโ DiaryData+CoreDataClass.swift
โโโ DiaryData+CoreDataProperties.swift
โโโ WeatherData+CoreDataClass.swift
โโโ WeatherData+CoreDataProperties.swift
โโโ MappingModelV2ToV3.xcmappingmodel
โย ย โโโ xcmapping.xml
โโโ Podfile
โโโ Podfile.lock
โโโREADME.md
- โ Date Formatter์ ์ง์ญ ๋ฐ ๊ธธ์ด๋ณ ํํ์ ํ์ฉ
- โ Text View์ ํ์ฉ
- โ Notification์ ํ์ฉํ ํค๋ณด๋ ๋์์ ๋ฐ๋ฅธ View ์ ์ด
- โ Compositional Layout์ ์ด์ฉํ CollectionView ํ์ฉ
- โ SwiftLint ์ ์ฉ
ํผ์ณ๋ณด๊ธฐ
1๏ธโฃ MainViewController
- ์ฑ ๋์ ์ ๊ฐ์ฅ ๋จผ์ ๋ณด์ฌ์ฃผ๋ View์ ๋ํ
Controller
์ ๋๋ค. MainViewController
์์ CollectionView์ DataSource๋ก๋ DiffableDataSource๋ฅผ ์ฌ์ฉํ์์ต๋๋ค.
2๏ธโฃ AddViewController
- Right Navigation Bar Button์ ํด๋ฆญํ์ ๋ ๋ณด์ฌ์ง๋
AddDiaryView
์ ๋ํController
์ ๋๋ค. - ๋ด๋ถ์์
title
์ ์ค์ ์ธ์ด์ ๋ง๋ ๋ ์ง๋ก ์ค์ ํ์์ต๋๋ค.
3๏ธโฃ DecodeManager
- ์์๋ฐ์ดํฐ์ธ Json ๋ฐ์ดํฐ์ ๋ํ
Decoder
์ decode๊ด๋ จ ๋ฉ์๋๋ฅผ ์ ์ํ ๊ตฌ์กฐ์ฒด๊ฐ ์ ์๋ ํ์ผ์ ๋๋ค.
4๏ธโฃ Diary
- ๋ง ๊ทธ๋๋ก Diary์ ๋ํ ๋ฐ์ดํฐ์ด๋ฉฐ,
Hashable
์ ๋ง์กฑํ๊ธฐ ์ํดuuid
๋ฅผ ์ถ๊ฐํ์์ต๋๋ค.
- โ ์ฝ์ด๋ฐ์ดํฐ ๋ชจ๋ธ ์์ฑ
- โ Swipe๋ฅผ ํตํ ์ญ์ ๊ธฐ๋ฅ ๊ตฌํ
- โ Swipe๋ฅผ ํตํ ๊ณต์ ๊ธฐ๋ฅ ๊ตฌํ
- โ ActivityController ๊ตฌํ
- โ NSMutableAttributeString ํ์ฉ
- โ UICollectionLayoutListConfiguration ํ์ฉ
- โ Text View Delegate์ ํ์ฉ
ํผ์ณ๋ณด๊ธฐ
1๏ธโฃ CoreDataManager
- CoreDataManager์์ CRUD๋ฅผ ๊ตฌํํ์์ต๋๋ค.
- Create(Save)
- Read(Fetch)
- Update
- Delete
- ์ ๋ฉ์๋๋ค์ ์ ์ํ์ฌ CoreDataManager์ ์ฑ๊ธํค ๊ฐ์ฒด์์ ํธ์ถํ ์ ์๋๋ก ๊ตฌํํ์์ต๋๋ค.
2๏ธโฃ AddViewController โก๏ธ EditViewController
- Add, Modifyํ๋ ๊ธฐ๋ฅ์ Controller์ ํ๋์ Controller๋ก ํตํฉํ์์ต๋๋ค.
3๏ธโฃ EditDiaryView
- Add, Modify ํ๋ฉด์ ํ๋์ View๋ก ํตํฉํ์์ต๋๋ค.
- โ Open API์ ํ์ฉ
- โ Core Location์ ํ์ฉ
- โ ์ฝ์ด๋ฐ์ดํฐ ๋ชจ๋ธ ๋ฐ DB ๋ง์ด๊ทธ๋ ์ด์
- โ ์ฝ์ด๋ฐ์ดํฐ ๋ชจ๋ธ Relationship ์ฌ์ฉ
- โ NSMutableAttributeString ์ฌ์ฉ
- โ selectedTextRange ์ฌ์ฉ
- โ NSCache ์ฌ์ฉ
- โ DarkMode ์ ์ฉ
ํผ์ณ๋ณด๊ธฐ
1๏ธโฃ CurrentDiary
- CoreData์ ManagedObject์ ์ง์ ์ ๊ทผํ์ง ์๊ธฐ ์ํ Type์ ๋๋ค.
- ํด๋น ์ธ์คํด์ค๋ฅผ ์์ฑํ์ฌ ์ฌ์ฉ์๊ฐ ์ ๋ ฅํ Diary ์ ๋ณด๋ค์ ๋ฃ๊ณ CoreData ๋ด๋ถ์ Saveํ๋๋ก ํ์์ต๋๋ค.
2๏ธโฃ CurrentWeather
- CoreData์ ManagedObject์ ์ง์ ์ ๊ทผํ์ง ์๊ธฐ ์ํ Type์ ๋๋ค.
- ์ฌ์ฉ์ Device์ ๋ํ ์๋ ๊ฒฝ๋๋ฅผ ๋ฐํ์ผ๋ก ํด๋น ์ธ์คํด์ค๋ฅผ ์์ฑํ์ฌ Open API์์ ๊ฐ์ ธ์จ ๋ ์จ์ ๋ํ data์ icon์ ๋ํ data๋ฅผ ๋ฃ๊ณ CoreData ๋ด๋ถ์ Saveํ๋๋ก ํ์์ต๋๋ค.
3๏ธโฃ NetworkManager
- Server์ ๋ฐ์ดํฐ๋ฅผ ์์ฒญํ๊ธฐ ์ํ fetchData()๊ฐ ์ํด์๋ class์ ๋๋ค.
- ํด๋น ํด๋์ค๋ ์ฌ๋ฌ๊ฐ ๋ง๋ค ํ์๊ฐ ์๋ค๊ณ ์๊ฐ๋์ด ์ฑ๊ธํค ํจํด์ ์ฌ์ฉํ์์ต๋๋ค.
4๏ธโฃ NetworkRequest
- ์๋, ๊ฒฝ๋๋ฅผ ๋ฐํ์ผ๋ก ๋ ์จ์ ๋ํ data, ๋ ์จ iconID์ ๋ํ data๋ฅผ ๋ฐ์์ฌ ์ ์๋ URL.
- ๋ ์จ iconID์ ์๋ฒ์ ๋ณด๋ด์ ํด๋น ID์ ๋ง๋ IconImage๋ฅผ ๋ฐ์์ฌ ์ ์๋ URL.
- ์์ 2๊ฐ์ case์ ๋ง๋ URL์ ์ป๊ธฐ ์ํด ๋ง๋ ๋ณ๋์ enum ํ์ ์ ๋๋ค.
5๏ธโฃ WeatherAPIData
- ์๋ฒ์์ ๋ฐ์์จ weather ๋ฐ์ดํฐ๋ฅผ ๋์ฝ๋ฉํ๊ธฐ ์ํ Type์ ๋๋ค.
ํผ์ณ๋ณด๊ธฐ
- ํ์ฅ์ฑ์ ์ํด CollectionView๋ฅผ ์ฌ์ฉํ์ฌ TableView๋ฅผ ๊ตฌ์ฑํ๊ณ ์ ํ์์ต๋๋ค. ์ถํ์ ์๊ตฌ์ฌํญ์ด Grid ํ์ผ๋ก ๋ณ๊ฒฝ๋์ด๋ ๋น ๋ฅธ ๋์์ด ๊ฐ๋ฅํ๋ค๊ณ ์๊ฐํ์์ต๋๋ค
- ํ์ง๋ง ๊ฐ๋ฐ์ ๋ชจ๋ ๋ง์น ํ, ๊ฐ๋ฐ ์๋๋ฅผ ๊ณ ๋ คํ๋ค๋ฉด ๋น๊ต์ ์ฌ์ด TableView๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ๋น ๋ฅธ ํ๋ก์ ํธ ์งํ์ ๋์์ด ๋ ๊ฒ์ด๋ผ๋ ์๊ฐ๋ ๋ค์์ต๋๋ค.
- ํฅํ Step2์์ ํด๋น ๋ถ๋ถ์ UICollectionViewList ํน์ UITableView๋ก ๋ณ๊ฒฝ๋ ์์ ์ ๋๋ค.
ํผ์ณ๋ณด๊ธฐ
- ๊ธฐ์กด์ DataSource๋ฅผ ๊ฒฝํํด๋ณด๊ณ ์๋กญ๊ฒ Diffable Data Source๋ฅผ ์ฌ์ฉํด๋ณด๊ณ ์ ํ์์ต๋๋ค.
- DiffableDataSource์ ์ฅ์ ์ ๋ฐ์ดํฐ ๋๊ธฐํ, ๋ฐ์ดํฐ ์ถ๊ฐ, ์ ๋ฐ์ดํธ, ์ญ์ ์ Animate์ ์ฉ์ด ๊ฐ๋ฅํ๋ค๋ ์ ์ ๋๋ค.
- ๋ํ ๊ธฐ์กด์ DataSource๋ณด๋ค ์ฝ๋๋๋ ๊ฐ์์ํฌ์ ์๋ค๋ ์ ์ด ์์ต๋๋ค.
- ๊ทธ๋ฆฌ๊ณ Section๋ง๋ค ๋ค๋ฅธ ๋ฐ์ดํฐ๋ค์ ์ ์ฉํ ์๋ ์๋ค๋ ์ ์ด ์ฅ์ ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค.
- DiffableDataSource๋ฅผ ์ ์ฉํด๋ณด๋ฉด์ ์ฝ๋์ ๊ธธ์ด๊ฐ ๊ธธ์ด์ง๋ ๋ถ๋ถ์ typealias๋ฅผ ํ์ฉํ์์ต๋๋ค.
- ์์ง Animation์ ์ ์ฉํ๋ ๋ถ๋ถ์ด ๋ง์ง ์์ ๊ธฐ์กด DataSource์ ๋น๊ตํด์ ์ฅ์ ์ ๋ํ ์ฒด๊ฐ์ ๋ชปํ๊ณ ์์ต๋๋ค. ํ์ง๋ง ์ถํ Animation์ ์ ์ฉํ๋ ๋ถ๋ถ์ด ๋ง์์ง๋ค๋ฉด Diffable DataSurce๋ก ์ฌ์ฉ์ ๊ฒฝํ์ ๋ํ ์ ์๋ค๋ ์ ์ ํฐ ์ฅ์ ์ด๋ผ๊ณ ์๊ฐ์ด ๋์ด ๋์ ํด๋ณด์์ต๋๋ค.
ํผ์ณ๋ณด๊ธฐ
- ์๋ก์ด Diary๋ฅผ ์ถ๊ฐ ํ ๋ ์ง์ญ์ ๋ง๋ ๋ ์ง, ๋ ์ง ํ๊ธฐ๋ฒ์ ์๋์ ์ผ๋ก ์ ํํด์ฃผ๋ ๊ฒ์ด ์๋ ์๋์ ์ผ๋ก ๋ฐํํด์ฃผ๊ธฐ ์ํด DataFormatter๋ฅผ ์ถ๊ฐํด ์ฃผ์์ต๋๋ค.
- ์ฌ์ฉ์์ ๊ธฐ๊ธฐ preferredLanguage์ ๋ฐ๋ผ ๋ ์ง์ ํ๊ธฐ๋ฐฉ๋ฒ์ด ์๋์ผ๋ก ๋ณ๊ฒฝ๋๋๋ก ๊ตฌํํ์์ต๋๋ค.. (์ธ๊ณํ, Internationalization)
- ์ฌ์ฉ์์ ์์น์ ๋ฐ๋ผ ๋ ์ง๊ฐ ๋ณํ ์ ์๋๋ก,
Locale
์ ํ์ฉํ์ฌ Localization(์ง์ญํ)๋ฅผ ํด์ฃผ์์ต๋๋ค.
extension Formatter {
static func changeCustomDate(_ date: Date) -> String {
let locale = NSLocale.preferredLanguages.first
let formatter = DateFormatter()
formatter.locale = Locale(identifier: locale ?? Locale.current.identifier)
formatter.timeZone = TimeZone(identifier: TimeZone.current.identifier)
...
return formatter.string(from: date)
}
}
ํผ์ณ๋ณด๊ธฐ
- ๊ฐ ๋ฉ์ธํ๋ฉด์ List์ Cell์ Swipe์ Share, Deleteํ ์ ์๋ ๊ธฐ๋ฅ์ด ํ์ํ์์ต๋๋ค.
- Diary App์์
UICollectionLayoutListConfiguration
๋ฅผ ์ฌ์ฉํ์๊ธฐ ๋๋ฌธ์UISwipeActionsConfiguration
๋ฅผconfiguration.trailingConfiguration
์ ์ถ๊ฐํด์ฃผ์์ต๋๋ค.
var configuration = UICollectionLayoutListConfiguration(appearance: .plain)
configuration.trailingSwipeActionsConfigurationProvider = .some({ indexPath in
self.delegate?.makeSwipeActions(for: indexPath)
})
- ๊ทธ๋ฆฌ๊ณ ShareAction, DeleteAction์ ์ถ๊ฐ ๊ตฌํํด์ฃผ์์ต๋๋ค.
ํผ์ณ๋ณด๊ธฐ
NSMutableAttributedString
์ ๋ฌธ์์ด์ ํน์ ๋ถ๋ถ์ ์ํ๋ ์์ฑ์ ์ฃผ๊ณ ์ถ์ ๋ ์ฌ์ฉํ๋ ๊ฐ์ฒด์ ๋๋ค. ํน์ ๋ฌธ์์ด๋ง ๋ค๋ฅธ ํฐํธ, ๋ค๋ฅธ Color์ ๋ถ์ฌํ ์ ์์ต๋๋ค.- ํ๋์ TextView์์ ์ฒซ์ค(Title)์ Text๊ณผ ๊ทธ ์ด์ธ์ Text๋ฅผ ๋ค๋ฅธ Font๋ฅผ ์ ์ฉํ๊ณ ์ ํ์์ต๋๋ค.
- ๋ํ AttributeString์ ์ฌ์ฉํจ์ ๋ฐ๋ผ ์ปค์์ ๋งจ๋ง์ง๋ง์ผ๋ก ์ด๋๋จ์ ๋ฐ๋ผ
selectedTextRange
๋ฅผ ์ฌ์ฉํ์ฌ ์ฌ๋ฐ๋ฅธ ์ปค์์ ์์น๋ก ์ด๋์์ผ์ฃผ์์ต๋๋ค.
ํผ์ณ๋ณด๊ธฐ
- CoreData์ WeatherData ์ถ๊ฐ๊ฐ ํ์ํ๊ธฐ ๋๋ฌธ์ Data Migration์ ์ฌ์ฉํ์์ต๋๋ค. CoreData Migration์ Managed Object์ ์๋ณธ ๊ฐ์ ์ฐจ์ด์ ์ ์๋์ผ๋ก ์ ์ถํฉ๋๋ค. ์ด๋ WeatherData๋ฅผ ์ถ๊ฐ๋ง ํ๊ธฐ๋๋ฌธ์ ๋ณ๋์ MappingModel์ ๋ง๋ค์ง ์์์ต๋๋ค.
- Migration์ ์งํ์ ํ ํ์, Weather Data์ ๊ธฐ์กด์ Diary Data๊ฐ ๋ฐ์ดํฐ์ ์ฑํฅ์ด ๋ค๋ฅด๊ธฐ ๋๋ฌธ์ ํ๋์ Entity์ ์๋ ๊ฒ์ ๋ง์ง ์๋ค๊ณ ๋๊ปด์ก์ต๋๋ค.
- ๋๋ฌธ์, Entity๋ค ๊ฐ์ ๊ด๊ณ๋ฅผ ์ ์ํด ์ค ์ ์๋, Entity๋ค ๊ฐ์ ์ํฅ์ ์ค๋ช ํด์ค ์ ์๋ Relationship์ ์ถ๊ฐํด์ฃผ์์ต๋๋ค.
- ์ถ๊ฐ๋ฅผ ํํ์๋ ํ๋์ Entity์์ ๋ ๊ฐ์ Entity๋ก ๋๋ ์ก๊ธฐ ๋๋ฌธ์ ๋ณ๋์ MappingModel ๋ํ ์ถ๊ฐํด ์ฃผ์์ต๋๋ค.
DiaryData | WeatherData |
---|---|
ํผ์ณ๋ณด๊ธฐ
- Device์ ์๋ ๊ฒฝ๋๋ฅผ ๋ฐํ์ผ๋ก ํ์ฌ ๋ ์จ ๋ฐ ๋ ์จ์ ๊ด๋ จ๋ Icon์ ๋ฐ์์ค๊ธฐ ์ํด Openweather API๋ฅผ ์ฌ์ฉํ์์ต๋๋ค.
- NetworkManager๋ผ๋ ํด๋์ค๋ฅผ ๋ง๋ค๊ณ ๋ด๋ถ์์ API์ ํต์ ์ ํ ์ ์๋ ๋ฉ์๋๋ฅผ ๊ตฌํํด์ฃผ์์ต๋๋ค.
ํผ์ณ๋ณด๊ธฐ
- Core Location์ iOS ๊ธฐ๋ณธ Framework์ธ Core Service์ ์ํด์๋ Framework์ ๋๋ค.
- ๊ธฐ๋ณธ์ ์ผ๋ก iPhone Device์ ์์น๋ฅผ ์ป์ด์ฌ ์ ์๋ Framework์ ๋๋ค.
- Core Location์ ์ฌ์ฉํ๊ธฐ ์ํด์๋
CLLocationManger
๋ผ๋ ์ธ์คํด์ค๋ฅผ ๋ฐ๋์ ์ฌ์ฉํด์ผํฉ๋๋ค. - ๋ํ, Info.plist์์ ์์น ๊ถํ์ ํ์ฉํ ์ ์๋ ์ ๋ณด ์ ๊ณต Alert์ ๋์์ค์ผํฉ๋๋ค.
- ํด๋น ํ๋ก์ ํธ์์๋ ์ผ๊ธฐ๋ฅผ ์ ๋ ฅํ ๋, ์์น๋ฅผ ๋ถ๋ฌ์์ ์์น์ ๋ํ ๋ ์จ ์ ๋ณด(๋ ์จ ์์ด์ฝ)์ Navigation Bar์ ๋ณด์ฌ์ค์ผํ๊ณ , Main ํ๋ฉด์์ ์ ์ฅํ ๋ ์จ ์ ๋ณด์ ๋ํ ๋ ์จ ์์ด์ฝ์ ๋ณด์ฌ์ค์ผํ๊ธฐ ๋๋ฌธ์ ์๋, ๊ฒฝ๋ ์ ์ฅ์ ์ํด ์ฌ์ฉ์ ํ์์ต๋๋ค.
if let coordinate = locations.last?.coordinate {
let url = NetworkRequest.fetchData(lat: String(coordinate.latitude),
lon: String(coordinate.longitude)).generateURL()
...
- ์ ์ฝ๋์ฒ๋ผ coordinate์์ ์๋, ๊ฒฝ๋๋ฅผ ๋ฐ์ ์ฌ ์ ์์ต๋๋ค.
ํผ์ณ๋ณด๊ธฐ
๋ฌธ์ ๐
- ์ ํฌ๋ ํค๋ณด๋ ์ฌ์ฉ์ ๋ฐ๋ผ
TextView
์ ์ ์ฝ์กฐ๊ฑด์ ๋ณ๊ฒฝํ์ฌTextView
๊ฐ ํค๋ณด๋๋ฅผ ์ ์ธํ๊ณ ๋ณด์ฌ์ง๋๋ก ํ์ต๋๋ค. ํ์ง๋งTextView
์Bottom
์ ์ฝ์ ๋ณ๊ฒฝํด์ฃผ๋ ๋ฐฉ์์ผ๋ก ๊ตฌํํ์ต๋๋ค.
ํผ์ณ๋ณด๊ธฐ
๋ฌธ์ ๐
- UIComponent๋ฅผ View์์ ์์ฑํ ๋ ํด๋ก์ ๋ฅผ ์ด์ฉํ์ฌ ์์ฑํ์์์ต๋๋ค. ์ฌ๋ฌ๊ฐ์ Label, StackView๊ฐ ํ์ํ ์ํฉ์์ ์ฝ๋์ ์ค๋ณต์ฑ์ด ๋๊ปด์ก๊ณ ๋นํจ์จ์ ์ด๋ผ๊ณ ์๊ฐ์ด ๋ค์์ต๋๋ค.
ํด๊ฒฐ ๐ฅ
- 2๊ฐ ์ด์ ์ฌ์ฉ๋๋ UIComponent๋ค์ ๋ํด์ Extension์ผ๋ก ์ ํฌ๊ฐ ์ํ๋ convenience initializer์ ์์ฑํด์ฃผ์์ต๋๋ค.
- ์ด๋ ๊ฒ ๊ตฌํ์ ๊ฒฐ๊ณผ 1๊ฐ์
UIComponent
๋ฅผ ์์ฑํ ๋, ๊ธฐ์กด๋ณด๋ค ์ฝ๋๋์ด 1/5 ์ค๋ก ๊ฐ์ํ์์ต๋๋ค.
// Befor
private lazy var bottomStackView: UIStackView = {
let stackView = UIStackView(arrangedSubviews: [dateLabel, previewLabel])
stackView.spacing = 5
stackView.axis = .horizontal
stackView.alignment = .center
stackView.distribution = .fill
return stackView
}()
// After
private lazy var bottomStackView = UIStackView(subview: [dateLabel, previewLabel],
spacing: 5,
axis: .horizontal,
alignment: .firstBaseline,
distribution: .fill)
ํผ์ณ๋ณด๊ธฐ
- Diary๋ฅผ ADDํ๊ณ , Modifyํ๋ Controller์ ์ญํ ๊ณผ View๊ฐ ๋งค์ฐ ์ ์ฌํ๋ค๊ณ ์๊ฐ์ ํ์ต๋๋ค.
MainViewController
์์ Modify๋ฅผ ํ ๋๋indexPath
๋ฅผ ํตํด ๋ฐ์ดํฐ๋ฅผ ์ ๋ฌํ๊ณ , + ๋ฒํผ์ ๋๋ฌ ์ถ๊ฐํ ๋๋nil
์ ์ ๋ฌํ์ฌ Controller๊ฐ Add๊ธฐ๋ฅ, Modify๊ธฐ๋ฅ์ ๋ถ๊ธฐ์ฒ๋ฆฌ ํ ์ ์๋๋ก ๊ตฌํํ์์ต๋๋ค.- ๋ ๊ฐ์ง์ ๊ธฐ๋ฅ์ ํ๋๋ก ํ์์ ๋์ ์ฅ์ ์ ๋ก์ง์ ์ถ๊ฐ๋์ง๋ง ์ ์ฒด์ ์ธ ์ฝ๋๋ ๊ฐ์, ๊ด๋ฆฌํ Class๊ฐ ์ ์ด์ง๋ค๋ ์ ์ด๋ผ๊ณ ์๊ฐ์ด ๋ญ๋๋ค.
- ํ์ง๋ง, ๋ ๊ฐ์ ์ปจํธ๋กค๋ฌ๋ฅผ ์ฌ์ฉํ๋ฉด ๋ก์ง์ด ๊ฐ๊ฒฐํด์ง๋ค๋ ์ , ๋ช ํํ๋ค๋ ์ ์์ ์ด์ ์ด ์๋ค๊ณ ์๊ฐ์ด ๋ค์์ต๋๋ค.
ํผ์ณ๋ณด๊ธฐ
- ๋ฆฌ์คํธ๋ฅผ ๊ตฌํํ๊ธฐ์ํด
UICollectionLayoutListConfiguration
์ ์ฌ์ฉํ์์ต๋๋ค. CollectionView
์Configuration
๊ตฌ์ฑ์ View์ ์ญํ ์ด๋ผ๊ณ ์๊ฐ์ด ๋์ด View ๋ด๋ถ์CollectionView Configure
์ ํ๋ ๋ฉ์๋๋ฅผ ๊ตฌํํ์์ต๋๋ค.- ํ์, Swipe๋ฅผ ๊ตฌํํด์ผํ์ ๋ View์์ ๊ตฌํํ Configureํ๋ ๋ฉ์๋์์ SwipeActione๋ค์ ์ถ๊ฐํด์ฃผ์ด์ผ ํ๊ณ , Swipe ๊ธฐ๋ฅ์ ๋ง๋ค๊ธฐ ์ํด์๋ Controller์ Snapshot์ ๋ํ ์ ๊ทผ, Delete Swipe ๊ธฐ๋ฅ์ ์ํ CoreData์ ๋ํ ์ ๊ทผ์ ํ์๋ก ํ์์ต๋๋ค.
ViewController
์์CollectionView
ํน์,Configure
์ View ์์ฑ์์ ์ ์ฃผ์ ํ๋ ๋ฐฉ๋ฒ๋ ์ข๊ฒ๋ค๊ณ ์๊ฐํ์ง๋ง,Controller
์ ์ญํ ์์ ๋ฒ์ด๋ ๊ธฐ๋ฅ์ ์ํํ๋ค๊ณ ํ๋จํ์ฌ Delegate ํจํด์ ์ฌ์ฉํ์ฌSwipeConfiguration
์ ์ ๋ฌํ์์ต๋๋ค.
ํผ์ณ๋ณด๊ธฐ
- ์ฒ์์๋
textField
์textView
์ ๋ง๋ค์์ต๋๋ค. ๊ฐ๊ฐ์ ํด๋นํ๋ ํฐํธ๋ฅผ ์ฌ์ฉํ์ต๋๋ค.- textField : title3
- textView : body
- ๊ทธ๋ ๊ธฐ ๋๋ฌธ์ Field, View ๊ฐ์ ๊ฐ์ญ์ด ์๊ธฐ ๋๋ฌธ์ ํฐํธ์ ๋ํด์ ์ ๊ฒฝ์ ๋ง์ด ์จ์ฃผ์ง ์์์ต๋๋ค.
- ๋ง์ ์๊ฐ ํ, ์ฐ๋ฆฌ๋ ์์ดํฐ
๋ฉ๋ชจ
์ฑ์ ์ฐธ๊ณ ํ์ฌ ์ฌ์ฉ์ ๊ณ ๋ คํ์ฌ, ํ๋์TextView
๋ก ๋ณด์ฌ์ฃผ๊ณ ์ ํ์ต๋๋ค. - ๊ทธ๋ ๊ธฐ์
NSMutableAttributedString
์ ์ฌ์ฉํ์ฌ ์ฒซ๋ฒ์งธ Title ๋ถ๋ถ๋ง์ ๋ค๋ฅธ ํฐํธ๋ก ์ ์ฉํ์์ต๋๋ค.
func textView(_ textView: UITextView, shouldChangeTextIn range: NSRange, replacementText text: String) -> Bool { ... }
func textViewDidChange(_ textView: UITextView) { ... }
- ํ ์คํธ ์ ๋ ฅ์ ์ฆ๊ฐ์ ์ผ๋ก Font ๋ณ๊ฒฝ์ ์ํด ์์ ๋ ๋ฉ์๋๋ฅผ ์ฌ์ฉํ์๋๋ฐ,
NSMutableAttributedString
์ด ํธ์ถ๋ ๋๋ง๋คํ ์คํธ ์ปค์
๊ฐ ํ ์คํธ์ ๋ง์ง๋ง์ ์์นํ๊ฒ ๋์์ต๋๋ค.
- AttributeString์ ์ฌ์ฉํ๋ฉด์ ํ ์คํธ ์ ๋ ฅ์ ๋งค๋ฒ AttributeString์ด ํธ์ถ ๋๊ธฐ ๋๋ฌธ์ ํ ์คํธ ์ปค์๊ฐ ๋งจ ๋ง์ง๋ง์ผ๋ก ์์ง์ด๋ ๊ฒ์ ํ์ธํ์ต๋๋ค.
- ๊ทธ๋์ ํ ์คํธ์ ๋ณํ๊ฐ ๊ฐ์ง๋๋ Delegate์ธ textViewDidChange๋ฅผ ์ด์ฉํ์ต๋๋ค.
- ํ ์คํธ๊ฐ ๊ฐ์ง๋๊ณ ์ปค์์ ์์น๋ฅผ ๊ธฐ์ตํ ํ AttributeString์ ํธ์ถํฉ๋๋ค. ๊ทธ๋ค์ ์๋ ์ปค์๋ก ๋์๊ฐ๋๋ก ๋ง๋ค์ด ์ฃผ์์ต๋๋ค.
- textRange(from: to:) ๋ฐ UITextPosition()์ ์ฌ์ฉํ์ฌ ์ปค์์ ์์น๋ฅผ ๊ธฐ์ตํ๋๋ก ํ์ต๋๋ค.
func textViewDidChange(_ textView: UITextView) {
guard let range = textView.selectedTextRange else { return }
guard let position = textView.position(from: range.start, offset: 0) else { return }
...
AttributeString()
...
textView.selectedTextRange = textView.textRange(from: position, to: position)
}
- ์์๊ฐ์ด ํ ์คํธ๋ฅผ ๊ธฐ์ต ํ selectedTextRange๋ฅผ ํตํด ์ปค์๋ฅผ ์ด๋์์ผ ํด๊ฒฐํ์ต๋๋ค.
ํผ์ณ๋ณด๊ธฐ
- ์ ์ฌ์ฌ์ฉ์ ์ด๊ธฐํ๋ฅผ ์ํด prepareForReuse๋ฅผ ํธ์ถํ์ต๋๋ค.
- ํ์ง๋ง ์๋์ ์ฌ์ง๊ณผ ๊ฐ์ด super๋ฅผ ํธ์ถํ์ง ์๊ณ ์ฌ์ฉํ๋ค๋ณด๋ ์ ์ ๋ชจ์์ด ๋ณํ๋๋ ํ์์ด ๋ฐ์ํ์ต๋๋ค.
super ํธ์ถ | super ๋ฏธํธ์ถ |
---|---|
- ๊ทธ๋์ override ํ ๋๋ super ํธ์ถ์ ๋ํด ํ๋ฒ๋ ์๊ฐํด์ผ ํ๋ค๋ ๊ตํ์ ์ป์์ต๋๋ค....
ํผ์ณ๋ณด๊ธฐ
Data(contentsOf: url)
๋ฅผ ์ฌ์ฉํ์ฌ ์ด๋ฏธ์ง ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์์์ต๋๋ค.- ํ์ง๋ง ๋งค์ฐ ๋๋ฆฌ๊ฒ ์์ด์ฝ์ด ์
๋ก๋๊ฐ ๋์๊ณ ,
Data(contentsOf: url)
๋ฉ์๋๋ฅผ ์์๋ณธ ๊ฒฐ๊ณผ ํด๋น ๋ฉ์๋๋ ๋ด๋ถ์ ์ผ๋ก ๋๊ธฐ๋ก ๋์ํ๊ธฐ ๋๋ฌธ์, ๋์์ด ๋งค์ฐ ๋๋ฆฌ๋ค๋ ๊ฒ์ ์๊ฒ๋์์ต๋๋ค. - ๋ํ ํด๋น ๋ฉ์๋๋ URLSession๊ณผ ๋ฌ๋ฆฌ ์์ ์ ๋ํ ์ง๋จ์ ์ํํ ์ ์์์ต๋๋ค.
- URLSession์์๋ ์ค๋ฅ๊ฐ ๋คํธ์ํฌ ์ค๋ฅ์ธ์ง, HTTP ์ค๋ฅ์ธ์ง, contents ์ค๋ฅ ์ธ์ง ๋ฑ์ ํํ ์ ์๋ ๋ฐ๋ฉด Data(contentsOf:)์์๋ ์ด๋ฅผ ํ์ธํ ์ ์์์ต๋๋ค.
- ๋ฐ๋ผ์ ์ด๋ฏธ์ง๋ค์ dataTask๋ฅผ ํ์ฉํ๋
dataTask
๋ฅผ ํ์ฉํfetchData()
๋ฉ์๋๋ฅผ ์ฌ์ฉํ์ฌ ์๋๋ฅผ ๊ฐ์ ํ ์ ์์์ต๋๋ค.
[๊ณต์๋ฌธ์]
- Siwft_Language_Guide
- AppleDoucument
- HIG
- API