์๋ ํ์ธ์, ๊ฐ์์ ๋๋ค. ์ด๋ฒ ์๊ฐ์๋ ํจ์คํธ ์บ ํผ์ค ๊ฐ์๋ฅผ ๋ณด๋ฉด์ ๋ฐ๋ผํด๋ณธ (ํด๋ก ์ฝ๋ฉ) ๊ฐ๋จํ Todo List๋ฅผ ๋ง๋ค์ด๋ณด๋ ์ฝ๋์ ๋ํด์ ๋ฆฌ๋ทฐ๋ฅผ ํด๋ณด๋ ค๊ณ ํด์. ์ฒ์ ๋ฐฐ์ฐ๋ ์ฑ๊ฐ๋ฐ์ด๋ค๋ณด๋, ํด๋ก ์ฝ๋ฉ์ ํ๋ฉด์๋ ๋ชจ๋ฅด๋ ๋ถ๋ถ์ด ์กฐ๊ธ ์๋๋ผ๊ตฌ์. ๊ทธ๋์ ํ๋ก์ ํธ๊ฐ ํ๋์ฉ ๋๋ ๋๋ง๋ค ์ด๋ ๊ฒ ๊ฐ๋จํ๊ฒ๋ผ๋ ๋ฆฌ๋ทฐ๋ฅผ ๋จ๊ฒจ๋ณด๋ ค๊ณ ํฉ๋๋ค.
์ ๊ฐ ๊ตฌํํ๊ณ , ๊ธฐ๋ฅ๊ณผ ์ค๋ช ์ ์ ๋ฆฌํด๋ ๊นํ๋ธ ๋งํฌ์ ๋๋ค. (์์ ํ ์ ์ฒด์ฝ๋๋ฅผ ๋ณผ ์ ์์ต๋๋ค.)
https://github.com/deslog/TodoList
0. ์ค๋น
์ฐ๋ฆฌ๋ ์ฑ๊ฐ๋ฐ์ ํ ๊ฒ์ด๊ธฐ ๋๋ฌธ์, project๋ฅผ ์์ฑํ ๋ iOS์์ App์ ์ ํํด ์ฃผ์์ต๋๋ค. ์ ๋ ํ์ผ๋ช ์ TodoList๋ก ์ค์ ํด์ฃผ์๊ณ , ์ฃผ ์ธ์ด๋ Swift๋ฅผ ์ ํํด์ฃผ์์ต๋๋ค.
์ด๋ ๊ฒ ์๋ก์ด ํ๋ก์ ํธ๋ฅผ ์์ฑํ๋ฉด ์๋์ ๊ฐ์ด ํ์ผ๋ค(?)์ด ์์ฑ๋ฉ๋๋ค. ์ฌ๊ธฐ์ main.storyboard ์์ ์ฌ์ฉ์ ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ ๊ฒ์ด๊ณ , ๋ค์ํ ๋ฒํผ, ํ๋ฉด์ ๊ธฐ๋ฅ์ ViewController.swift ํ์ผ์์ ์ฝ๋๋ฅผ ์์ฑํ ์์ ์ ๋๋ค.
์ ๋ ์ธํฐ๋ท ๊ฐ์๋ฅผ ๋ณด๊ณ ์งํํ ๊ฒ์ด๊ธฐ ๋๋ฌธ์, main.storyboard ์ ui๋ฅผ ๋ง๋๋ ๊ณผ์ ์ ์๋ตํ๊ณ , ViewController.swiftํ์ผ์ ์์ฑํ๋ ๊ธฐ๋ฅ ์์ฃผ๋ก ์ฝ๋ ๋ฆฌ๋ทฐ๋ฅผ ํด๋ณด๋ ค๊ณ ํฉ๋๋ค.
1. ์์ฑ๋ ํ๋ฉด
์์ฑ๋ ํ๋ฉด์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
์ด๊ธฐ ํ๋ฉด์ ์ค๋ฅธ์ชฝ ์๋จ์๋ Edit๋ฒํผ, ์ผ์ชฝ ์๋จ์๋ ํ ์ผ์ ์ถ๊ฐํ ์ ์๋ + ๋ฒํผ์ด ์์ต๋๋ค. ํ ์ผ ๋ฑ๋ก (+)๋ฒํผ์ ๋๋ฅด๋ฉด, ํ์ ์ฐฝ์ ํ ์ผ์ ๋ฑ๋กํ ์ ์๋ alert์ฐฝ์ด ๋จ๊ณ , ๊ทธ ์์ textField๊ฐ ์์ต๋๋ค. textField์ ํ ์ผ์ ์ ๋ ฅํ๊ณ ๋ฑ๋ก๋ฒํผ์ ๋๋ฅด๋ฉด, ํ ์ผ์ด ์์ฑ๋ฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ฌ์ง์๋ ๋์์์ง ์์ง๋ง, ํ ์ผ์ ํ๋ฉด์์ ํด๋ฆญํ๋ฉด ์ค๋ฅธ์ชฝ์ V ํ์๊ฐ ๋๋ฉฐ ํ ์ผ์ด ์๋ฃ๋๋ค๋ ํ์๋ ํ ์ ์์ต๋๋ค.
edit๋ฒํผ์ ํด๋ฆญํ๋ฉด ํ ์ผ cell ๋ง๋ค ์ญ์ ํ ์ ์๋ ๋ฒํผ (-)์ด ์ผ์ชฝ์ ์์ฑ๋๊ณ , ์ค๋ฅธ์ชฝ์๋ ํ ์ผ์ ์์๋ฅผ ๋ฐ๊ฟ์ ์๋ ์ฌ์ ๋ ฌ ๋ฒํผ์ด ์์ต๋๋ค. ๋ํ edit๋ฒํผ์ ๋๋ฅด์ง ์๊ณ , ์ผ์ชฝ์ผ๋ก ์ค์์ดํํด์ ์ญ์ ๊ฐ ๊ฐ๋ฅํ๊ฒ๋ ์ค์ ์ ํด๋์์ต๋๋ค.
์ด์ ์ฝ๋๋ฅผ ์ด๋ป๊ฒ ๊ตฌํํ๋์ง, ๋ค์ ์ดํด๋ณด๋๋ก ํ์ฃ .
2. ViewController.swift ์ฝ๋ ์ดํด๋ณด๊ธฐ (๊ธฐ๋ฅ ๊ตฌํ)
2.1 ํ ์ผ์ ๋ฑ๋กํ๋ฉด ํ ์ผ๋ค์ด ํ ์ด๋ธ๋ทฐ์ ํ์๋๊ฒ ๊ตฌํํ๊ธฐ
ํ์ฌ ui๋ ์๋์ ๊ฐ์ด ๋ง๋ค์ด๋์ ์ํ์ ๋๋ค. ์ฌ๊ธฐ์ table View์ ํ ์ผ๋ค์ ๋ชฉ๋ก์ด ํํ๋๊ฒ ๋ง๋ค์ด์ฃผ๊ฒ ์ต๋๋ค. ๊ทธ๋ฌ๊ธฐ ์ํด์๋ table View์ ํ ์ผ์ ์ถ๊ฐํ๊ธฐ ์ํ edit๋ฒํผ๊ณผ add(+) ๋ฒํผ์ action๊ธฐ๋ฅ๋ ํ์ํฉ๋๋ค.
class ViewController: UIViewController {
@IBOutlet weak var tableView: UITableView!
@IBOutlet var editButton: UIBarButtonItem!
var doneButton: UIBarButtonItem?
var tasks = [Task]() {
didSet { // ํ๋กํผํฐ ์ต์ ๋ฒ, tasks ๋ฐฐ์ด์ ํ ์ผ์ด ์ถ๊ฐ๋ ๋๋ง๋ค ์ ์ ๋ํดํธ์ ํ ์ผ์ด ์ ์ฅ๋จ
self.saveTasks()
}
}// Task ๋ฐฐ์ด ์์ฑ
์ฐ์ viewController class์ tableView๋ผ๋ ์ด๋ฆ์ IBOutlet ๋ณ์๋ฅผ ์์ฑํด ์ฃผ๊ณ , editButton IBOulet๋ณ์๋ ์์ฑํด ์ค์๋ค. editButton์ UIBarButtonItem ํํ๋ก ํ์ฑํด์ฃผ์์ต๋๋ค. (doneButtonn, tasks ๋ฑ์ ์ถํ ๋ ํด๋น ๊ธฐ๋ฅ์ ์ถ๊ฐํ ๋ ๋ฆฌ๋ทฐํ๊ฒ ์ต๋๋ค. ์ฐ์ ์์๋ ๋ณ์๋ง ์ง์ค)
๊ทธ๋ฆฌ๊ณ edit๊ณผ add ๋ฒํผ์ ๋ํ ์ก์ ํจ์๋ ์ถ๊ฐํด์ฃผ๊ฒ ์ต๋๋ค. (@IBActionํจ์)
@IBAction func tapeditButton(_ sender: UIBarButtonItem) {
guard !self.tasks.isEmpty else { return }
self.navigationItem.leftBarButtonItem = self.doneButton
self.tableView.setEditing(true, animated: true)
}
// alert; ์ ๋ชฉ, ๋ฉ์ธ์ง, ํ๋์ด์์ ๋ฒํผ ๋ฐ ์
๋ ฅ์ ์์งํ๊ธฐ ์ํ ํ
์คํธ ํ๋๋ก ๊ตฌ์ฑ๋์ด ์๋ค.
@IBAction func tapAddButton(_ sender: UIBarButtonItem) {
let alert = UIAlertController(title: "ํ ์ผ ๋ฑ๋ก", message: "ํ ์ผ์ ์
๋ ฅํด์ฃผ์ธ์.", preferredStyle: .alert)
let registerButton = UIAlertAction(title: "๋ฑ๋ก", style: .default, handler: { [weak self] _ in
guard let title = alert.textFields?[0].text else { return }
let task = Task(title: title, done: false)
self?.tasks.append(task)
//๋ฑ๋ก๋ฒํผ์ ๋๋ฟ์๋ ํ
์คํธํ๋์ ์๋ ๊ฐ์ ๊ฐ์ ธ์ฌ ์ ์๋ค.
// textFields๋ ๋ฐฐ์ด์ธ๋ฐ, ์ฐ๋ฆฌ๋ ํ๋๋ง ๋ฃ์ด๋ง๊ธฐ ๋๋ฌธ์ [0]๋ก ์ ๊ทผํ์.
self?.tableView.reloadData() // add๋ ํ ์ผ๋ค์ ํ
์ด๋ธ๋ทฐ์ ์๋ก์๋ก ์
๋ก๋ํด์ฃผ๋ ๊ฒ
})
let cancelButton = UIAlertAction(title: "์ทจ์", style: .cancel, handler: nil)
alert.addAction(cancelButton)
alert.addAction(registerButton)
alert.addTextField(configurationHandler: { textField in
textField.placeholder = "ํ ์ผ์ ์
๋ ฅํด์ฃผ์ธ์." })
self.present(alert, animated: true, completion: nil)
}
โถ tapAddButton ๋จผ์ ์ดํด๋ณด๊ฒ ์ต๋๋ค.
์์์ ์ค๋ช ํ๋ฏ์ด Add ๋ฒํผ์ ๋๋ฅด๋ฉด alert์ฐฝ์ ๋์ ์ถ๊ฐํ ์ ์๋๋ก ๋ง๋ค ์์ ์ ๋๋ค. ๋ฐ๋ผ์ alert ์์๋ฅผ ์ ์ธํด์ UIAlertController๋ฅผ ์ด์ฉํด์ alert์ด ํ์๋๊ฒ ๋ง๋ค์์ต๋๋ค. title์ "ํ ์ผ ๋ฑ๋ก", message๋ "ํ ์ผ์ ์ ๋ ฅํด์ฃผ์ธ์", preferredStyle ์๋ .alert์ ์ค์ ํด์ฃผ์์ต๋๋ค.
preferredStyle ์๋ alert์ action์ํธ ๋๊ฐ์ง๊ฐ ์กด์ฌํ๋๋ฐ, ๋๊ฐ์ง์ ์ฐจ์ด๋ ๋ค์๊ณผ๊ฐ์ต๋๋ค.
๊ทธ ๋ค์ registerbutton์ด๋ผ๋ ์์๋ฅผ ์ ์ธํํ, UIAlertAction ๊ธฐ๋ฅ์ ํ์ฉํ์ฌ alert์ ๋ฒํผ์ด ์ถ๊ฐ๋๊ฒ ๋ง๋ค์ด์คฌ์ต๋๋ค. Title์ ๋ฑ๋ก, style์ ๋ํดํธ๋ก, handler ํ๋ผ๋ฏธํฐ์๋ ํด๋ก์ ๋ฅผ ์ ์ํ์ต๋๋ค. ์ฌ์ฉ์๊ฐ ์๋ฟ ๋ฒํผ์ ๋๋ ์๋, ์คํํด์ผํ๋ ํ๋์ ํด๋ก์ ์์ ์ ์ํด์ฃผ๋ฉด ๋ฉ๋๋ค. ๋ฑ๋ก๋ฒํผ์ ๋๋ฅผ๋๋ง๋ค ํ ์ผ์ ์ถ๊ฐํด์ค์ผํ๊ธฐ ๋๋ฌธ์ ์ด ๊ธฐ๋ฅ์ ๋ด์ ํด๋ก์ ๋ฅผ ์ ์ํด์ฃผ๋ฉด ๋ฉ๋๋ค.
๊ทธ ์ดํ alert ์ฐฝ์๋ cancle ๋ฒํผ๋ ์ถ๊ฐํด์ฃผ๊ธฐ ์ํด์ canclebutton ์ ์ ์ธํด์ฃผ์๊ณ , style์ cancle, ํ๋ํด์ผํ ํ๋ผ๋ฏธํฐ๋ฅผ ์ ์ํ๋ handler์๋ nil๋ก ์ ์ํด์ฃผ์์ต๋๋ค.
๊ทธ๋ฆฌ๊ณ alert.addAction ๋ฉ์๋๋ฅผ ํตํด ๋ฐฉ๊ธ ๋ง๋ uibutton์ ๋ฃ์ด์ฃผ๋ฉด๋ฉ๋๋ค. ๋ํ ์ฐ๋ฆฌ๋ alert์ฐฝ์์ ํ ์ผ์ ๋ํ ์ ๋ ฅ์ ๋ฐ์ ๊ฒ์ด๊ธฐ ๋๋ฌธ์, textField๋ฅผ ์ถ๊ฐํด์ฃผ์ด์ผํฉ๋๋ค. textField๋ฅผ ์ถ๊ฐํ๋ ๋ฐฉ๋ฒ์ ๊ฐ๋จํฉ๋๋ค. ์ ์ฝ๋์ฒ๋ผ alert.addTextFields ๋ฉ์๋๋ฅผ ํตํด ๊ฐ๋จํ๊ฒ ์ถ๊ฐํ ์ ์์ต๋๋ค. configurationhandler ํ๋ผ๋ฏธํฐ์๋ ํด๋ก์ ๋ฅผ ๋ฃ์ด์ฃผ์ด์ผ ํ๋๋ฐ, ์๋ฟ์ ํ์ํ๊ธฐ ์ ์ ํ ์คํธํ๋๋ฅผ ๊ตฌ์ฑํ๊ธฐ ์ํ ํด๋ก์ ์ ๋๋ค. ์ด ํด๋ก์ ๋ ๋ฐํ๊ฐ์ด ์๊ณ , textField ๊ฐ์ฒด์ ํด๋นํ๋ ๋จ์ผ๋งค๊ฐ๋ณ์๋ฅผ ์ฌ์ฉํฉ๋๋ค. ํ๋ง๋๋ก ์๋ฟ์ ์ฌ์ฉํ๋ ํ ์คํธํ๋๋ฅผ ์ค์ ํ๋ ํด๋ก์ ๋ผ๊ณ ์๊ฐํ๋ฉด๋ฉ๋๋ค. ๊ทธ๋์ ์ฐ๋ฆฌ๋ , "ํ ์ผ์ ์ ๋ ฅํด ์ฃผ์ธ์" ๋ผ๊ณ placeholder๋ก ํ์๋๊ฒ ๋ง๋ค์์ต๋๋ค.
์ด์ ์ด๋ ๊ฒ ์ก์ ์ ์ค์ ์๋ฃํ์ผ๋,
โท ์ฌ์ฉ์๊ฐ ์ง์ง ์ ๋ ฅํ ํ ์ผ์ tasks ๋ผ๋ ๋ฐฐ์ด์ ์ ์ฅํด์ค์๋ค. (ํ ์ด๋ธ๋ทฐ์ ํ์ํ๊ธฐ ์ํด ์ ์ฅ์ด ํ์)
task๋ผ๋ ๊ตฌ์กฐ์ฒด๋ฅผ ์ถ๊ฐํด์ฃผ์์ต๋๋ค. New File์ ๋ง๋ค์ด์, task.swfitํ์ผ์ ๋ง๋ค์์ต๋๋ค. ๊ทธ ์์ task๋ฅผ ์ ์ํด์ฃผ์์ต๋๋ค.
//
// Tesk.swift
// TodoList
//
import Foundation
struct Task {
var title: String // ํ ์ผ ๋ด์ฉ ์ ์ฅ
var done: Bool // ํ ์ผ์ด ์๋ฃ ๋์๋์ง ์ฌ๋ถ ์ ์ฅ
}
title ํ๋กํผํฐ์๋ ํ ์ผ ๋ด์ฉ์ ์ ์ํด์ค๊ฒ์ด๊ณ , done์ด๋ผ๋ ํ๋กํผํฐ์๋ ์๋ฃ ๋์๋์ง์ ๋ํ ์ฌ๋ถ๋ฅผ ์ ์ํ ์์ ์ ๋๋ค.
๊ทธ๋ฆฌ๊ณ ์ด์ ํ ์ผ๋ค์ ์ ์ฅํ๋ ๋ฐฐ์ด์ ๋ง๋ค์ด์ค์๋ค.
viewController ํ์ผ๋ก ๋์๊ฐ์, class์ tasks๋ณ์๋ฅผ ์์ฑํด์ฃผ์์ต๋๋ค.
๊ทธ๋ฆฌ๊ณ ์์ registerButton handler ํด๋ก์ ๋ถ๋ถ์ tasks ๋ฐฐ์ด์ ํ ์ผ์ด ์ถ๊ฐ๋ ์ ์๋๋ก ์บก์ณ๋ชฉ๋ก์ ์ ์ํด์ฃผ์์ต๋๋ค. ํด๋ก์ ์ ์ธ๋ถ๋ถ์์ ์บก์ณ๋ชฉ๋ก์ ์ ์ํด์ฃผ๋ ์ด์ ๋, ํด๋์ค์ฒ๋ผ ํด๋ก์ ๋ ์ฐธ์กฐํ์ ์ด๊ธฐ ๋๋ฌธ์ ํด๋ก์ ์ ๋ณธ๋ฌธ์์ self๋ก ํด๋์ค์ ์ธ์คํด์ค๋ฅผ ์บก์ณํ ๋ ๊ฐํ ์ํ์ฐธ์กฐ๊ฐ ๋ฐ์ํ ์ ์๋ค๊ณ ํฉ๋๋ค. ๊ฐํ ์ํ์ฐธ์กฐ๋, ๋๊ฐ์ ๊ฐ์ฒด๊ฐ ์ํธ ์ฐธ์กฐํ๋ ๊ฒฝ์ฐ ๊ฐํ ์ํ์ฐธ์กฐ๊ฐ ๋ง๋ค์ด์ง๋๋ฐ, ์ด๋ ๊ฒ ๋๋ฉด ์ํ์ฐธ์กฐ์ ์ฐ๊ด๋ ๊ฐ์ฒด๋ค์ ๋ ํผ๋ฐ์ค ์นด์ดํธ๊ฐ 0์ ๋๋ฌํ์ง ์๊ฒ ๋๊ณ , ๊ฒฐ๊ตญ ๋ฉ๋ชจ๋ฆฌ ๋์๊ฐ ๋ฐ์ํ๊ฒ ๋ฉ๋๋ค. ๊ทธ๋์ ์ด ๊ฐํ ์ํ์ฐธ์กฐ๋ฅผ ํด๊ฒฐํ๋ ๋ฐฉ๋ฒ์ ํด๋ก์ ์ ์ํ๋ถ์์ ์บก์ณ๋ชฉ๋ก์ ์ ์ํจ์ผ๋ก์จ ํด๊ฒฐํ ์ ์์ต๋๋ค. ์ฐ๋ฆฌ๋ [weak self]๋ฅผ ์์ฑํ๋ฏ๋ก์จ ์บก์ณ๋ชฉ๋ก์ ์ ์ํ๋ค๊ณ ์๊ฐํ๋ฉด ๋๋ค. (์ดํ ๋ ๋ค๋ฃฐ ์์ ์ด๋ผ๊ณ ํฉ๋๋ค . ๊ทธ๋ ์์ธํ ์ค๋ช ํ๋๋ก ํ๊ฒ ์ต๋๋ค ใ ใ ) ํด๋ก์ ์ ์ ์ธ๋ถ์ weak๋ unknown ํค์๋๋ก ์บก์ณ๋ชฉ๋ก์ ์ ์ํ์ง ์๊ณ , ์ ๊ทผํ๊ฒ ๋๋ฉด ๊ฐํ ์ํ์ฐธ์กฐ๊ฐ ๋ฐ์ํ๊ฒ ๋์ด ๋ฉ๋ชจ๋ฆฌ ๋์๊ฐ ๋ฐ์ํ ์ ์๋ค๋ ์ ๋ง ์์๋์.
๋ค์ ์ฝ๋๋ก ๋์๊ฐ์,
textfield๋ ์ต์ ๋๋ก ๋ฐํ๋๊ธฐ ๋๋ฌธ์ guard๋ก ๋ฐ์ธ๋ฉ์ ํด์ฃผ์์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ tasks ์ ๋ฐฉ๊ธ ๋ง๋ค์ด์ค task ์ธ์คํด์ค๋ฅผ ์ถ๊ฐํด์ฃผ๋ฉด์ ์๋ฟ์ฐฝ์ ํ ์ผ์ ๋ฑ๋กํ ๋๋ง๋ค tasks์ ํ ์ผ๋ค์ด ์ถ๊ฐ๋๋๋ก ๋ง๋ค์ด์ฃผ์์ต๋๋ค.
โท ๋ค์์ผ๋ก tasks ๋ฐฐ์ด์ ์ ์ฅ๋์ด์๋ ํ ์ผ๋ค์ tableView์ ๋ํ๋ด์ด๋ด ์๋ค.
uI table View ๋ฐ์ดํฐ์์ค ํ๋กํ ์ฝ์ viewController์ ์ฑํํด์ฃผ์์ต๋๋ค.
override func viewDidLoad() {
super.viewDidLoad()
self.doneButton = UIBarButtonItem(barButtonSystemItem: .done, target: self, action: #selector(doneButtonTap))
// Do any additional setup after loading the view.
self.tableView.dataSource = self
self.tableView.delegate = self
self.loadTasks() // ์ ์ ๋ํด์ธ ์ ์ ์ฅ๋ ํ ์ผ์ ์ฑ์ ๊ป๋ค ์ผ๋ ๋ค์ ๋ถ๋ฌ์์ฃผ๋๊ฒ
}
์ด๋ ๊ฒ viewDidLoad ํจ์์ dataSource์ delegate๋ฅผ self๋ก ์ฑํํด์ฃผ์์ต๋๋ค. ์ด๋ ๊ฒ ์์ฑํ๊ณ ๋๋ฉด, UITableViewDataSource๋ฅผ ์ฑํํ๋ผ๋ ๊ฒฝ๊ณ ๊ฐ ๋จ๊ฒ ๋ฉ๋๋ค. ๋ฐ๋ผ์ class ์ธ๋ถ์ extension์ ์ด์ฉํด์ datasource๋ฅผ ์ฑํํด๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.
extension ViewController: UITableViewDataSource {
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return self.tasks.count
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath)
// ์ฌ์ฉํ์ง ์๋ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๋ญ๋นํ์ง ์๊ธฐ ์ํด์ dequeueResusableCell์ ์ด์ฉํด์ ์
์ ์ฌ์ฌ์ฉ ํ๋ ๊ฒ
let task = self.tasks[indexPath.row]
cell.textLabel?.text = task.title
// ์
ํ์๋์ ๋ ์ฒดํฌ๋งํฌ ํ์๋๊ฒ ํ๋ ์ฝ๋
if task.done {
cell.accessoryType = .checkmark
} else {
cell.accessoryType = .none
}
return cell
}
cell.textLabel?.text = task.title ์ฝ๋ ๋ถ๋ถ์์ task์ ์ ๋ ฅ๋ title๋ค์ cell์ ๋ด์์ฃผ๊ณ , return cell์ ํตํด ๋ฐํํด์ฃผ์์ต๋๋ค. ๊ทธ๋ฌ๋ฉด ํ ์ผ์ ๋ฑ๋กํ ๋๋ง๋ค ํ ์ด๋ธ๋ทฐ๋ฅผ ๊ฐฑ์ ํ์ฌ ๋ณด์ฌ์ฃผ์ด์ผํ๊ธฐ ๋๋ฌธ์ tapAddButton ํจ์๋ก ๋ค์ ๋์๊ฐ์, self?.tableView.reloadData() ๋ฉ์๋๋ฅผ ํตํด ํ ์ด๋ธ๋ทฐ์ ์๋ ๋ด์ฉ๋ค์ reload ํด์ค ์ ์๋๋ก ๋ง๋ค์ด์ค๋๋ค.
์ฌ๊ธฐ๊น์ง ์๋ฃํ๋ฉด, add ๋ฒํผ์ ๋๋ฅผ ๋๋ง๋ค, ํ ์ด๋ธ๋ทฐ์ ๋ฐ์ดํฐ๊ฐ ๋ก๋๋๋ ๊ฒ์ ๋ณผ ์ ์์ต๋๋ค. ํ์ง๋ง ์ฌ๊ธฐ๊น์ง๋ง ์๋ฃํ๋ค๋ฉด, ๋ฌธ์ ์ ์ด ์๋๋ฐ ์ฑ์ ์ข ๋ฃํ๊ฒ ๋ ๊ฒฝ์ฐ ๋ฐ์ดํฐ๊ฐ ์ ์ฅ๋์ง ์๊ณ ์ ๋ ฅํ๋ ํ ์ผ๋ค์ด ๋ชจ๋ ์ญ์ ๋๋ค๋ ๊ฒ์ธ๋ฐ, ์ด๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด์๋ userdefaults๋ฅผ ์ด์ฉํด์ ์ฐ๋ฆฌ๊ฐ ์ ๋ ฅํ ๋ฐ์ดํฐ๋ค์ด ์ฑ์ ์ฌ์คํํ๋๋ผ๋ ๋ชจ๋ ์ด์์๋๋ก ๋ฐ๋ก ์ฒ๋ฆฌ๋ฅผ ํด์ฃผ์ด์ผํฉ๋๋ค.
๋ค์๊ธ ์์๋ userDefaults๋ฅผ ์ด์ฉํ ์ฝ๋ ๋ฆฌ๋ทฐ์ ๋ํด์ ์ ๋ก๋ ํ๊ฒ ์ต๋๋ค.
์ค๋ช ํ๊ณ , ์ ๊ฐ ์์๋ฃ๊ฒ ๋ฌธ์ํํ๋๋ผ ์ฝ๋๊ฐ ๋ค์ฃฝ๋ฐ์ฃฝ์ธ๋ฐ, github.com/deslog/TodoList์ ๋ฐฉ๋ฌธํ์๋ฉด ์ ์ฒด์ฝ๋๋ฅผ ๋ณด์ค ์ ์์ต๋๋ค.
'potato's iOS Story > CloneApp + ์ฝ๋๋ฆฌ๋ทฐ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[CloneApp] (UIKit) toss ์ฑ ํด๋ก ์ฝ๋ฉ - (2) Home ํญ UI ๋ง๋ค๊ธฐ (0) | 2022.07.14 |
---|---|
[CloneApp] (UIKit) toss ์ฑ ํด๋ก ์ฝ๋ฉ - (1) TabBar ๋ง๋ค๊ธฐ (2) | 2022.06.30 |
[iOS/Swift] xcode์ SwiftLint ์ค์นํ๊ธฐ (0) | 2022.05.29 |