์ผ๊ธฐ ์ถ๊ฐ |
์ผ๊ธฐ ์์ |
์ผ๊ธฐ ์ญ์ |
![](https://camo.githubusercontent.com/9cc3dc37f3e044f7ced1b4a4288e18242e42e6568e4c5939c5aff42e7c48a9cd/68747470733a2f2f692e696d6775722e636f6d2f5a6255375434342e676966) |
![](https://camo.githubusercontent.com/05117b90b70fadad69750f28cade046c982fb8df66f7d9ef4d171ea88b66258a/68747470733a2f2f692e696d6775722e636f6d2f594b78384d41782e676966) |
![](https://camo.githubusercontent.com/43dd9c149c1860d035c6728ea4cc98ad16dc1dea835e48e9f9a284944d5136d4/68747470733a2f2f692e696d6775722e636f6d2f694f5141736a432e676966) |
์คํ ํด๋ฆญ |
์ ๋ณด ์ ์ง |
์คํ ์ ์ง |
![](https://camo.githubusercontent.com/4fdb5fea8a7dabd8bc3258117b5169f7b6f72aea05dcb660bee9eec2cda8a65c/68747470733a2f2f692e696d6775722e636f6d2f61567a4e7777342e676966) |
![](https://camo.githubusercontent.com/2a31e4e0de8553d3650873c5833eb5d0a3abe224c9ac0e67af078d4b488ab12d/68747470733a2f2f692e696d6775722e636f6d2f6b4b6e3073434f2e676966) |
![](https://camo.githubusercontent.com/f45813ec771b526482f7b8e801e5941a86aeaa08b921be426dd49b212eb53395/68747470733a2f2f692e696d6775722e636f6d2f36454f456f35412e676966) |
๐ UI ๊ตฌ์ฑํ ๋ ์๊ธด UITabBarController ๊ด๋ จ ๊ถ๊ธ์ฆ.
๐ touchesBegan ๋ฉ์๋๋ ๋ฌด์์ผ๊น?
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
self.view.endEditing(true)
}
๐ addTarget ๋ฉ์๋ ํ์ฉ๋ฒ
๐ sendActions ๋ฉ์๋๋ฅผ ์ด์ฉํด ์ด๋ฒคํธ๋ฅผ ์ ๋ฌํ๊ธฐ
๐ ๋ฑ๋ก ๋ฒํผ ํ์ฑํ ๋ก์ง
private func validateInputField() {
self.confirmButton.isEnabled = !(self.titleTextField.text?.isEmpty ?? true) && !(self.dateTextField.text?.isEmpty ?? true) && !self.contentsTextView.text.isEmpty
}
- ๋ ์ฝ์ผ๋ ์ฑ์ ์ฌ์ฉํด ์ต์
๋๊ฐ์ ํด์ ํ ๋, ์๋์ ๊ฐ์ด ์ฌ์ฉํ์๋ค.
let x = something ?? 10 // ์ฌ๊ธฐ์ something์ Optional Int ํ์
- ๋ชฐ๋๋๊ฑด ์์ง ์ต์
๋์ด ํด์ ๋์ง ์์ ์ํ์์ ๋ด์ฅํจ์๋ฅผ ์ฌ์ฉํ๋ฉด ๋ด์ฅํจ์์ ๋ฐํ๊ฐ์ ์ต์
๋์ด ๋ถ๋๋ค.
- self.dateTextField.text?.isEmpty์ ๋ฐํ๊ฐ์ Bool? ํ์
์ด๋ค.
๐ segue + show(Navigation)์ ํตํด ํ๋ฉด์ ์ ํ์
- segue + show๋ฅผ ํตํด ํ๋ฉด์ ์ ํ์, ์ ํ๋๋ ํ๋ฉด์ ์ด๋ค ๊ฐ์ ๋ณด๋ด์ค์ผ ํ ๋๋ ์๋์ ๊ฐ์ด prepare(for,sender) ๋ฉ์๋๋ฅผ override ํด์ ์ฌ์ฉ.
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if let wrietDiaryViewController = segue.destination as? WriteDiaryViewController {
wrietDiaryViewController.delegate = self
}
}
๐ Modern CollectionView
๐ userDefaults ์ฌ์ฉ ๋ฐ didSet
- ๋จผ์ userDefaults๋ฅผ ์ฌ์ฉํ ์ฝ๋๋ฅผ ๋ณด์
// MARK: - userDefaults์์ DiaryList๋ฅผ ๊ฐ์ ธ์ค๋ ๋ฉ์๋
private func loadDiaryList() {
let userDefaults = UserDefaults.standard
if let data = userDefaults.value(forKey: "diary") as? Data {
let realData = try? PropertyListDecoder().decode([Diary].self, from: data)
self.diaryList = realData!
self.diaryList = self.diaryList.sorted(by: { // ์ฝ๋
$0.date > $1.date
// $0.date.compare($1.date) == .orderedDescending ์ด๋ ๊ฒ๋ ์์ฑํ ์ ์๋ค.
})
}
}
- loadDiaryList ๋ฉ์๋๋ userDefaults์์ key๋ฅผ ํตํด ๊ฐ์ ๊ฐ์ ธ์ ์ ๋ ฌ ํ diaryList์ ์ ์ฅํ๋ ๋ฉ์๋์ด๋ค.
- ํ๋กํผํฐ ์ต์ ธ๋ฒ didSet์ ํตํด ๊ฐ์ด ๋ฐ๋๋๊ฒ์ ๊ด์ฐฐํ๋ค ๋ฐ๋๋ฉด ์ ์ฅํด์ฃผ๋ saveDiaryList() ๋ฉ์๋๋ฅผ ํธ์ถํ์
private var diaryList = [Diary]() {
didSet {
saveDiaryList()
}
}
๐ Notification Center๋ฅผ ์ฌ์ฉํด ๋ณ๊ฒฝ์ฌํญ ์ ๋ฌํ๊ธฐ
- notification์ ์ฑ ๋ด ์๊ด ๊ด๊ณ๊ฐ ์๋ ๋ถ๋ถ๊ณผ ๋ถ๋ถ์ ์ด์ด์ฃผ๊ธฐ ์ํ ๋ฐฉ๋ฒ์ด๋ค.
๐ ๊ฐ์ ViewController์ ๋ค๋ฅธ ๋ชฉ์ ์ผ๋ก ์ ๊ทผ์ ์ด๋ป๊ฒ ๊ด๋ฆฌ ํ ๊น?
๐ TextField์ shouldChangeCharactersIn ๋ฉ์๋๋ ๋ฌด์์ผ๊น? (์
๋ฐ์ดํธ ์์ )
- ํ์ฌ๋ ํ
์คํธํ๋์ ํค๋ณด๋๋ก ์
๋ ฅ์ ํ์ง ๋ชปํ๊ฒ ๋ง์ ๋์๋ค.
๐ ๋คํฌ๋ชจ๋ ๊ฐ์งํ๊ธฐ(์ ๋ฆฌ ํ์) (์
๋ฐ์ดํธ ์์ )
override func traitCollectionDidChange(_ previousTraitCollection: UITraitCollection?) {
super.traitCollectionDidChange(previousTraitCollection)
if traitCollection.hasDifferentColorAppearance(comparedTo: previousTraitCollection) {
print(previousTraitCollection?.userInterfaceStyle)
print(UITraitCollection.current.userInterfaceStyle.rawValue)
// enum์ด๋ผ ์ผ์ด์ค๋ก ๋์จ๋ค. ์ผ์ด์ค๋ณ ๋ถ๊ธฐ์ฒ๋ฆฌ
}
}
๐ required init ์์ฑ์ ์์๋ณด๊ธฐ (์
๋ฐ์ดํธ ์์ )
๐ delegate์์ notification์ผ๋ก ๋ณ๊ฒฝํ ์ด์
๐ delegate์ ๋ฌธ์ ์
- ๊ตฌ์กฐ: DiaryVC(๋ชฉ๋ก)๊ณผ StarVC(์ฆ๊ฒจ์ฐพ๊ธฐ)์์ ์
์ ํด๋ฆญํ๋ฉด DetailDiaryVC๊ฐ ๋์์ง๋ค.
- ๊ธฐ์กด ๋ชฉ๋ก ํ๋ฉด์์ ์ผ๊ธฐ๋ฅผ ํด๋ฆญํ๋ฉด DetailDiaryViewController๋ฅผ ๋์ฐ๊ฒ ๋๋ค. ์ฌ๊ธฐ์๋ '์ญ์ '๋ฒํผ๊ณผ '์ฆ๊ฒจ์ฐพ๊ธฐ' ํ ๊ธ ๋ฒํผ์ด ์๋๋ฐ ์ด ๋ฒํผ์ ๋๋ฅด๋ฉด ๊ฐ๊ฐ์ ์ค์ ํด๋ delegate์ ์คํ ๋ฉ์๋๊ฐ ์คํ๋๋ค.
- ํ์ฌ์ ๋ก์ง์ ํ๋ก ๋ณด์๋ฉด ์๋์ ๊ฐ๋ค. (๊ทธ๋ฆผ์ด ์ด์ํ๊ฒ์ด ์๋๋ผ ์ญ์ ์ ์ฆ๊ฒจ์ฐพ๊ธฐ ๋ฒํผ์ด ๋๋ ธ์๋ ์ค์ ๋ก ์๋ํ๋ ๋ฉ์๋๊ฐ DiaryVC์ ๊ตฌํ ๋์ด์๊ธฐ ๋๋ฌธ์ด๋ค.
![](https://camo.githubusercontent.com/d018ae10ebebf9dfadc3e0c1fe47964df5dae0138109def1b7112bf56b71a3ff/68747470733a2f2f692e696d6775722e636f6d2f5663794b784c542e706e67)
- DiaryVC์์ ์๋์ ๊ฐ์ ์ฝ๋๋ฅผ ๋ณผ ์ ์๋ค.
extension DiaryViewController: UICollectionViewDelegate {
func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
...
DiaryDetailViewController.deleteDelegate = self
DiaryDetailViewController.starDelegate = self
... self.navigationController?.pushViewController(DiaryDetailViewController, animated: true)
}
}
- ์ฆ, DiaryDetailViewController์ deleteDelegate์ starDelegate์ ์๋ฌด๋ฅผ DiaryViewController๊ฐ ํ๊ฒ ๋ค๋ ์๋ฏธ์ด๋ค.
- ์ฆ, ์ญ์ ์์ ์ผ์ด๋ ์ผ, ์ฆ๊ฒจ์ฐพ๊ธฐ๋ฅผ ๋๋ฅด๋ฉด ์ผ์ด๋๋ ์ผ๋ค์ ๋ฌด์กฐ๊ฑด DiaryVC๊ฐ ์ฒ๋ฆฌํ๊ณ ์๋ค๋๊ฒ. (delegate ํจํด์ 1:1๋ก๋ง ๊ฐ๋ฅํ๋ค.)
![](https://camo.githubusercontent.com/707b02efc3e57b377037fcd44337a1955798e933220f68aa3ef8188e856c8c44/68747470733a2f2f692e696d6775722e636f6d2f547547765076652e706e67)
- ์์ ๊ฐ์ ๊ทธ๋ฆผ์ delegate pattern์ ์ฌ์ฉํด์๋ ๋ถ๊ฐ๋ฅํ๋ค๋ ์ด์ผ๊ธฐ ์ด๋ค.
- DiaryVC์ StarVC์์ ํน์ ๊ตฌ๋ถ์๋ฅผ ๊ตฌ๋
ํ๊ณ ์ญ์ ์ ์ฆ๊ฒจ์ฐพ๊ธฐ ๋ฒํผ์ด ํด๋ฆญ๋ ๋๋ง๋ค ํฌ์คํธ๋ฅผ ํ๋ฉด ํ๋์ ํ๋์ด 2๋ช
์ ๊ตฌ๋
์์๊ฒ ์ํฅ์ ๋ผ์น ์ ์๋ค๋ ์ ์ ํ์ฉํ๋ค.
๐ Notification์ผ๋ก ๋์ฒด ํ ํ๋ก์ฐ ์ฐจํธ
![](https://camo.githubusercontent.com/42a73fda7e384c531b0ed43d4808cb246ad25f8961139632280b46e4a0c133ac/68747470733a2f2f692e696d6775722e636f6d2f38724c634479732e706e67)
- delegate ํจํด์ ์ฌ์ฉํ์ ๋ ๋ณด๋ค ํ์คํ 1:N์ ๊ด๋ฆฌํ๋ ์ธก๋ฉด์์๋ ์ข์์ก๋ค.
- NotificationCenter๋ ์ฐ๊ด์ด ์๋ ๊ณณ์ผ๋ก ํน์ ์ด๋ฒคํธ๋ ํ๋์ ์ ๋ฌ ํ ๋ ๊ฐ์ฅ ํจ์จ์ ์ด๋ค. ์ง์ ๊ตฌ๋ถ์๊ฐ post ๋ ๋ ์ํ๋ ๊ณณ์์ ํธํ๊ฒ ๋ฐ์์ ์๋ค๋ ์ฅ์ ๋ ์์ง๋ง ๋ถ๋ช
ํ ๋จ์ ๋ ์กด์ฌํ๋ค.
- ์ด๋ฒคํธ์ ๋ฐ๋ผ ์ธ์ธํ๊ฒ ๋ค๋ฅธ ํ๋์ ํด์ผํ๋ค๋ฉด ์ง์ ๊ตฌ๋ถ์๋ฅผ ๋ค๋ฅด๊ฒ ํด์ ๋ณด๋ด์ผํ๋ค๋ ๊ฒ๊ณผ, ์ง์ ๊ตฌ๋ถ์์ ๊ฐฏ์๊ฐ ๋ง์์ง๋ฉด ๋ฌด์์ด ์ด๋ค ํ๋์ ํ๋์ง ๋ถ๊ฐํ๊ธฐ ํ๋ค ์๋ ์๋ค๋ ์๊ฐ์ด ๋ค์๋ค.
๐ ์ฑ ํฌ๋์ฌ ์ด์ ๋ฐ ํด๊ฒฐ ๋ฐฉ๋ฒ
- ์ฑ ํฌ๋์ฌ: DiaryVC์์ Cell์ ํด๋ฆญํ๋ฉด ํด๋น cell์ ์ ๋ณด๋ฅผ DetailVC๋ก ๋ณด์ฌ์ค๋ค. ๊ทธ ์ํ์์ ์ฆ๊ฒจ์ฐพ๊ธฐ ๋ฒํผ์ ๋๋ฅด๊ณ , ์ฑ ํ๋จ์ ์ฆ๊ฒจ์ฐพ๊ธฐ ํญ์ ๋๋ฅด๋ฉด ๋ฐฉ๊ธ ์ฆ๊ฒจ์ฐพ๊ธฐ ๋ฒํผ์ ๋๋ ๋ cell์ด ์๊ณ , ํด๋น cell์ ํด๋ฆญ ํ DetailVC๋ก ๋ค์ด๊ฐ ์ญ์ ๋ฅผ ํด์ค๋ค. ๊ทธ๋ฆฌ๊ณ ์ฑ ํ๋จ์ '์ผ๊ธฐ์ฅ' ํญ์ ๋๋ฅด๋ฉด ์๊น '์ฆ๊ฒจ์ฐพ๊ธฐ' ํญ์ผ๋ก ๋์ด์ค๊ธฐ ์ ํ๋ฉด์ด ๊ทธ๋๋ก ์๋ค(๋ค๋น๊ฒ์ด์
์คํ์์ pop์ด ๋์ง ์์์). ํ์ฌ ์ํ์์ ์์ ์ด๋ ์ญ์ ๋ฅผ ๋๋ฅด๋ฉด ์ฑ์ด ์ถฉ๋์ด ๋๋ค. ์ ๊ทธ๋ด๊น?
- ๊ฒฐ๋ก ์ ํด๋น ์ผ๊ธฐ๊ฐ ์๋๋ฐ ์์ ํ๋ ค ํ๊ฑฐ๋ ์ญ์ ํ๋ ค๊ณ ํ๊ธฐ ๋๋ฌธ์ด๋ค.
- ์์ ์ด๋ ์ญ์ ๋ ๊ฒฐ๊ตญ ์ง์ ๊ตฌ๋ถ์๋ฅผ ํตํด postํ๋๋ฐ ๊ทธ ์์ cell์ indexPath์ ๊ฐ์ ์ ๋ณด๋ฅผ ๋ด์์ ๋ณด๋ธ๋ค.
- indexPath๋ก ์ผ๊ธฐ๋ฅผ ๊ตฌ๋ถํ๋ ์ฝ๋๋ฅผ ๋ฒ์ฉ ๊ณ ์ ์๋ณ์์ธ UUID(Universally Unique IDentifier)๋ก ๋ฐ๊ฟ ์ฑ์ด ํฌ๋์ฌ ๋๋ ํ์์ ํด๊ฒฐํ๋ค.
๐ ์ฌ์ฉ์ ๊ฒฝํ ์ ํ ์์ ๋ฐ๊ฒฌ
- ์๋์ GIF์ ๊ฐ์ด ํญ๋ง๋ค ์ํ๊ฐ ๋ค๋ฅด๊ธฐ ๋๋ฌธ์ ๋ฐ์ดํฐ์ ํต์ผ์ฑ์ ๋ํด ์๊ฐ ํด๋ดค๋ค.
- ๋ ๊ฐ์ง ๋ฐฉ๋ฒ์ด ์๋๋ฐ ํ๋๋
-
- ํญ์ด ๋๋ฆด๋๋ง๋ค ํด๋น ํญ์ ๊ฐ์ฅ ์๋จ์ธ rootVC๋ก ๊ฐ๋ ๋ก์ง ๊ตฌํํ๊ธฐ
-
- ์์ ์ด ์ผ์ด๋ ๋ ๋ง๋ค notification์ ๋ณด๋ด ์
๋ฐ์ดํธ ํ๊ธฐ
- 1๋ฒ์ผ๋ก ์งํํ๋ ค๊ณ ํ๋๋ฐ ์ด ๋ํ ํญ์ ๋๋ฅด๋ฉด ์ด์ ์์
๋ฌผ์ด ๋ฉ๋ชจ๋ฆฌ์์ ํด์ (popViewController)๋๋ ์ํฉ์ด๋ผ ์ฌ์ฉ์ ๊ฒฝํ์ ๊ณ ๋ คํด 2๋ฒ์ผ๋ก ์งํํ๋ค.
- ๋จผ์ ํ์ฌ ์ฝ๋๋ DetailDiaryVC์์ ์์ ๋ฒํผ์ ๋๋ฅด๋ฉด "editDiary" ๋
ธํฐ์ ๋ํ ๊ตฌ๋
์ ์์ํ๋๋ฐ, ๋ฌธ์ ๋ ์ผ๊ธฐ์ฅ ํญ์์๋ DetailDiaryVC์ ๋ค์ด์ ์๊ณ ()"editDiary" ๋
ธํฐ์ ๋ํ ๊ตฌ๋
์ํ๊ณ ์์), ์ฆ๊ฒจ์ฐพ๊ธฐ์์๋ ์์ ๋ฒํผ์ ๋๋ฌ "editDiary" ๋
ธํฐ์ ๋ํ ๊ตฌ๋
์ ํ๊ณ ์๋ค. ์ฆ ๋ณ๊ฒฝ์ด ์ผ์ด๋๋ฉด ์ฆ๊ฒจ์ฐพ๊ธฐ์ DetailDiaryVC์ ๊ฐ๋ค๋ง ๋ฐ๋๊ณ ์๋ ์ํฉ.
- ์์ ๋ฒํผ์ ํด๋ฆญํ๋ฉด notification์ ๊ตฌ๋
ํ๋ ์ฝ๋๋ฅผ DetailDiary์ viewDidLoad()์ ๋ฃ์ด์ฃผ์ด์ ์์ ์ด ์ผ์ด๋์ ๋ง์ ๋ฐ๋ก ์
๋ฐ์ดํธ๋ฅผ ํ ์ ์๊ฒ ๋ง๋ค์ด์คฌ๋ค.
- ์๋๋ ๋ฐ์ดํฐ ์ผ๊ด์ฑ ๋ฌธ์ ์ ํด๊ฒฐ์ ๋ํ GIF
๋ฌธ์ |
ํด๊ฒฐ |
![](https://camo.githubusercontent.com/e011b8a2db44d3b5f716a4abe9370de1636e82b1c8c4a76091dafdb42e34ca6b/68747470733a2f2f692e696d6775722e636f6d2f78766f3332514e2e676966) |
![](https://camo.githubusercontent.com/145732e38ef15ca49c7c5059c0a4456c7ca868c2ff869c87dade1abd0cdb2d93/68747470733a2f2f692e696d6775722e636f6d2f32484d6a6a56322e676966) |
๐ ํ๋ก์ ํธ๋ฅผ ๋๋ด๊ณ ๋๋์ .
-
- ์์ง ์ ํํ๊ฒ ๋ฌด์ ๋๋ฌธ์ธ์ง๋ ๋ชจ๋ฅด๊ฒ ์ง๋ง, combine์ ํ์ดํ๋ผ์ธ ๊ตฌํ์ด ํ์ํ๋ค๊ณ ๋๊ผ๋ค.
-
- DiffableDataSource๋ฅผ ์ฌ์ฉ ํ ๋, flowlayout์์ ์ฌ์ฉํ๋ deleteItmes์ ๊ฐ์ ๋ฉ์๋๋ฅผ ์ฌ์ฉํ์ง ๋ง์. -> snapshot๊ณผ ๋์์ ์ด๋ฃจ์ด์ ธ ํฌ๋์ฌ ๋ฐ์!