Git Product home page Git Product logo

diary's Introduction

Diary

๐ŸŽ ์ž‘๋™ ํ™”๋ฉด

์ผ๊ธฐ ์ถ”๊ฐ€ ์ผ๊ธฐ ์ˆ˜์ • ์ผ๊ธฐ ์‚ญ์ œ
์Šคํƒ€ ํด๋ฆญ ์ •๋ณด ์œ ์ง€ ์Šคํƒ€ ์œ ์ง€

๐ŸŽ 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

  • ํ”„๋กœ์ ํŠธ์—์„œ ์‚ฌ์šฉํ•œ 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์— ๊ตฌํ˜„ ๋˜์–ด์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.
  • 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๋กœ๋งŒ ๊ฐ€๋Šฅํ•˜๋‹ค.)
  • ์œ„์™€ ๊ฐ™์€ ๊ทธ๋ฆผ์€ delegate pattern์„ ์‚ฌ์šฉํ•ด์„œ๋Š” ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค๋Š” ์ด์•ผ๊ธฐ ์ด๋‹ค.
  • DiaryVC์™€ StarVC์—์„œ ํŠน์ • ๊ตฌ๋ถ„์ž๋ฅผ ๊ตฌ๋…ํ•˜๊ณ  ์‚ญ์ œ์™€ ์ฆ๊ฒจ์ฐพ๊ธฐ ๋ฒ„ํŠผ์ด ํด๋ฆญ๋  ๋•Œ๋งˆ๋‹ค ํฌ์ŠคํŠธ๋ฅผ ํ•˜๋ฉด ํ•˜๋‚˜์˜ ํ–‰๋™์ด 2๋ช…์˜ ๊ตฌ๋…์ž์—๊ฒŒ ์˜ํ–ฅ์„ ๋ผ์น ์ˆ˜ ์žˆ๋‹ค๋Š” ์ ์„ ํ™œ์šฉํ–ˆ๋‹ค.

๐Ÿ“– Notification์œผ๋กœ ๋Œ€์ฒด ํ›„ ํ”Œ๋กœ์šฐ ์ฐจํŠธ

  • delegate ํŒจํ„ด์„ ์‚ฌ์šฉํ–ˆ์„ ๋•Œ ๋ณด๋‹ค ํ™•์‹คํžˆ 1:N์„ ๊ด€๋ฆฌํ•˜๋Š” ์ธก๋ฉด์—์„œ๋Š” ์ข‹์•„์กŒ๋‹ค.
  • NotificationCenter๋Š” ์—ฐ๊ด€์ด ์—†๋Š” ๊ณณ์œผ๋กœ ํŠน์ • ์ด๋ฒคํŠธ๋‚˜ ํ–‰๋™์„ ์ „๋‹ฌ ํ•  ๋–„ ๊ฐ€์žฅ ํšจ์œจ์ ์ด๋‹ค. ์ง€์ • ๊ตฌ๋ถ„์ž๊ฐ€ post ๋  ๋•Œ ์›ํ•˜๋Š” ๊ณณ์—์„œ ํŽธํ•˜๊ฒŒ ๋ฐ›์„์ˆ˜ ์žˆ๋‹ค๋Š” ์žฅ์ ๋„ ์žˆ์ง€๋งŒ ๋ถ„๋ช…ํžˆ ๋‹จ์ ๋„ ์กด์žฌํ–ˆ๋‹ค.
  • ์ด๋ฒคํŠธ์— ๋”ฐ๋ผ ์„ธ์„ธํ•˜๊ฒŒ ๋‹ค๋ฅธ ํ–‰๋™์„ ํ•ด์•ผํ•œ๋‹ค๋ฉด ์ง€์ • ๊ตฌ๋ถ„์ž๋ฅผ ๋‹ค๋ฅด๊ฒŒ ํ•ด์„œ ๋ณด๋‚ด์•ผํ•œ๋‹ค๋Š” ๊ฒƒ๊ณผ, ์ง€์ • ๊ตฌ๋ถ„์ž์˜ ๊ฐฏ์ˆ˜๊ฐ€ ๋งŽ์•„์ง€๋ฉด ๋ฌด์—‡์ด ์–ด๋–ค ํ–‰๋™์„ ํ•˜๋Š”์ง€ ๋ถ„๊ฐ„ํ•˜๊ธฐ ํž˜๋“ค ์ˆ˜๋„ ์žˆ๋‹ค๋Š” ์ƒ๊ฐ์ด ๋“ค์—ˆ๋‹ค.

๐ŸŽ ์•ฑ ํฌ๋ž˜์‰ฌ ์ด์œ  ๋ฐ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•

  • ์•ฑ ํฌ๋ž˜์‰ฌ: DiaryVC์—์„œ Cell์„ ํด๋ฆญํ•˜๋ฉด ํ•ด๋‹น cell์˜ ์ •๋ณด๋ฅผ DetailVC๋กœ ๋ณด์—ฌ์ค€๋‹ค. ๊ทธ ์ƒํƒœ์—์„œ ์ฆ๊ฒจ์ฐพ๊ธฐ ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅด๊ณ , ์•ฑ ํ•˜๋‹จ์˜ ์ฆ๊ฒจ์ฐพ๊ธฐ ํƒญ์„ ๋ˆ„๋ฅด๋ฉด ๋ฐฉ๊ธˆ ์ฆ๊ฒจ์ฐพ๊ธฐ ๋ฒ„ํŠผ์„ ๋ˆŒ๋ €๋˜ cell์ด ์žˆ๊ณ , ํ•ด๋‹น cell์„ ํด๋ฆญ ํ›„ DetailVC๋กœ ๋“ค์–ด๊ฐ€ ์‚ญ์ œ๋ฅผ ํ•ด์ค€๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์•ฑ ํ•˜๋‹จ์˜ '์ผ๊ธฐ์žฅ' ํƒญ์„ ๋ˆ„๋ฅด๋ฉด ์•„๊นŒ '์ฆ๊ฒจ์ฐพ๊ธฐ' ํƒญ์œผ๋กœ ๋„˜์–ด์˜ค๊ธฐ ์ „ ํ™”๋ฉด์ด ๊ทธ๋Œ€๋กœ ์žˆ๋‹ค(๋„ค๋น„๊ฒŒ์ด์…˜ ์Šคํƒ์—์„œ pop์ด ๋˜์ง€ ์•Š์•„์„œ). ํ˜„์žฌ ์ƒํƒœ์—์„œ ์ˆ˜์ •์ด๋‚˜ ์‚ญ์ œ๋ฅผ ๋ˆ„๋ฅด๋ฉด ์•ฑ์ด ์ถฉ๋Œ์ด ๋‚œ๋‹ค. ์™œ ๊ทธ๋Ÿด๊นŒ?
  • ๊ฒฐ๋ก ์€ ํ•ด๋‹น ์ผ๊ธฐ๊ฐ€ ์—†๋Š”๋ฐ ์ˆ˜์ •ํ•˜๋ ค ํ•˜๊ฑฐ๋‚˜ ์‚ญ์ œํ•˜๋ ค๊ณ  ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.
  • ์ˆ˜์ •์ด๋‚˜ ์‚ญ์ œ๋Š” ๊ฒฐ๊ตญ ์ง€์ • ๊ตฌ๋ถ„์ž๋ฅผ ํ†ตํ•ด postํ•˜๋Š”๋ฐ ๊ทธ ์•ˆ์— cell์˜ indexPath์™€ ๊ฐ™์€ ์ •๋ณด๋ฅผ ๋‹ด์•„์„œ ๋ณด๋‚ธ๋‹ค.
  • indexPath๋กœ ์ผ๊ธฐ๋ฅผ ๊ตฌ๋ถ„ํ•˜๋Š” ์ฝ”๋“œ๋ฅผ ๋ฒ”์šฉ ๊ณ ์œ  ์‹๋ณ„์ž์ธ UUID(Universally Unique IDentifier)๋กœ ๋ฐ”๊ฟ” ์•ฑ์ด ํฌ๋ž˜์‰ฌ ๋‚˜๋˜ ํ˜„์ƒ์„ ํ•ด๊ฒฐํ–ˆ๋‹ค.

๐ŸŽ ์‚ฌ์šฉ์ž ๊ฒฝํ—˜ ์ €ํ•˜ ์š”์†Œ ๋ฐœ๊ฒฌ

  • ์•„๋ž˜์˜ GIF์™€ ๊ฐ™์ด ํƒญ๋งˆ๋‹ค ์ƒํƒœ๊ฐ€ ๋‹ค๋ฅด๊ธฐ ๋•Œ๋ฌธ์— ๋ฐ์ดํ„ฐ์˜ ํ†ต์ผ์„ฑ์— ๋Œ€ํ•ด ์ƒ๊ฐ ํ•ด๋ดค๋‹ค.
  • ๋‘ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์ด ์žˆ๋Š”๋ฐ ํ•˜๋‚˜๋Š”
      1. ํƒญ์ด ๋ˆŒ๋ฆด๋•Œ๋งˆ๋‹ค ํ•ด๋‹น ํƒญ์˜ ๊ฐ€์žฅ ์œ—๋‹จ์ธ rootVC๋กœ ๊ฐ€๋Š” ๋กœ์ง ๊ตฌํ˜„ํ•˜๊ธฐ
      1. ์ˆ˜์ •์ด ์ผ์–ด๋‚ ๋•Œ ๋งˆ๋‹ค notification์„ ๋ณด๋‚ด ์—…๋ฐ์ดํŠธ ํ•˜๊ธฐ
  • 1๋ฒˆ์œผ๋กœ ์ง„ํ–‰ํ•˜๋ ค๊ณ  ํ–ˆ๋Š”๋ฐ ์ด ๋˜ํ•œ ํƒญ์„ ๋ˆ„๋ฅด๋ฉด ์ด์ „ ์ž‘์—…๋ฌผ์ด ๋ฉ”๋ชจ๋ฆฌ์—์„œ ํ•ด์ œ(popViewController)๋˜๋Š” ์ƒํ™ฉ์ด๋ผ ์‚ฌ์šฉ์ž ๊ฒฝํ—˜์„ ๊ณ ๋ คํ•ด 2๋ฒˆ์œผ๋กœ ์ง„ํ–‰ํ–ˆ๋‹ค.
  • ๋จผ์ € ํ˜„์žฌ ์ฝ”๋“œ๋Š” DetailDiaryVC์—์„œ ์ˆ˜์ •๋ฒ„ํŠผ์„ ๋ˆ„๋ฅด๋ฉด "editDiary" ๋…ธํ‹ฐ์— ๋Œ€ํ•œ ๊ตฌ๋…์„ ์‹œ์ž‘ํ•˜๋Š”๋ฐ, ๋ฌธ์ œ๋Š” ์ผ๊ธฐ์žฅ ํƒญ์—์„œ๋Š” DetailDiaryVC์— ๋“ค์–ด์™€ ์žˆ๊ณ ()"editDiary" ๋…ธํ‹ฐ์— ๋Œ€ํ•œ ๊ตฌ๋… ์•ˆํ•˜๊ณ  ์žˆ์Œ), ์ฆ๊ฒจ์ฐพ๊ธฐ์—์„œ๋Š” ์ˆ˜์ •๋ฒ„ํŠผ์„ ๋ˆŒ๋Ÿฌ "editDiary" ๋…ธํ‹ฐ์— ๋Œ€ํ•œ ๊ตฌ๋…์„ ํ•˜๊ณ ์žˆ๋‹ค. ์ฆ‰ ๋ณ€๊ฒฝ์ด ์ผ์–ด๋‚˜๋ฉด ์ฆ๊ฒจ์ฐพ๊ธฐ์˜ DetailDiaryVC์˜ ๊ฐ’๋“ค๋งŒ ๋ฐ”๋€Œ๊ณ  ์žˆ๋Š” ์ƒํ™ฉ.
  • ์ˆ˜์ •๋ฒ„ํŠผ์„ ํด๋ฆญํ•˜๋ฉด notification์„ ๊ตฌ๋…ํ•˜๋Š” ์ฝ”๋“œ๋ฅผ DetailDiary์˜ viewDidLoad()์— ๋„ฃ์–ด์ฃผ์–ด์„œ ์ˆ˜์ •์ด ์ผ์–ด๋‚˜์ž ๋งˆ์ž ๋ฐ”๋กœ ์—…๋ฐ์ดํŠธ๋ฅผ ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋งŒ๋“ค์–ด์คฌ๋‹ค.
  • ์•„๋ž˜๋Š” ๋ฐ์ดํ„ฐ ์ผ๊ด€์„ฑ ๋ฌธ์ œ์™€ ํ•ด๊ฒฐ์— ๋Œ€ํ•œ GIF
๋ฌธ์ œ ํ•ด๊ฒฐ

๐ŸŽ ํ”„๋กœ์ ํŠธ๋ฅผ ๋๋‚ด๊ณ  ๋Š๋‚€์ .

    1. ์•„์ง ์ •ํ™•ํ•˜๊ฒŒ ๋ฌด์—‡ ๋•Œ๋ฌธ์ธ์ง€๋Š” ๋ชจ๋ฅด๊ฒ ์ง€๋งŒ, combine์˜ ํŒŒ์ดํ”„๋ผ์ธ ๊ตฌํ˜„์ด ํ•„์š”ํ•˜๋‹ค๊ณ  ๋Š๊ผˆ๋‹ค.
    1. DiffableDataSource๋ฅผ ์‚ฌ์šฉ ํ•  ๋•Œ, flowlayout์—์„œ ์‚ฌ์šฉํ•˜๋Š” deleteItmes์™€ ๊ฐ™์€ ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ๋ง์ž. -> snapshot๊ณผ ๋™์‹œ์— ์ด๋ฃจ์–ด์ ธ ํฌ๋ž˜์‰ฌ ๋ฐœ์ƒ!

diary's People

Contributors

kayahn0126 avatar

Stargazers

 avatar

Watchers

 avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.