์๋ ํ์ธ์!
์ค๋ ํ๋ฃจ๋ ์ด๋ ๋๋ฉด์..
๋์ด๋๋ ๊ธฐ๋ฅ ์์ฌ๊ณผ ๊ทธ์ ํจ๊ป ๋์ด๋๋ ์ค๋ฅ๋ค์ ์ฒ๋ฆฌํ๊ณ ์์ตํ๊ธฐ์ ๊ธ๊ธํ์ต๋๋ค.
[ ์๋กญ๊ฒ ๊ตฌํํ ๊ธฐ๋ฅ๋ค ]
โ๏ธ TodoList์ ๋ ์ง ๊ตฌํ
Date() ๊ฐ์ ๋ฃ์ด์ ์ค๋์ ๋ ์ง ๊ตฌํ์ ์๋ฃํ์์ต๋๋ค!
Date ๊ฐ์ ๋ฃ๊ธฐ ์ํด์๋ Date๋ฅผ ๋ด๊ฐ ์ํ๋ String์ผ๋ก ๋ณ๊ฒฝํด์ผํ๊ณ , String์ผ๋ก ์ ์๋ ๋ ์ง๋ฅผ ๋ค์ Date๋ก๋ ๋ง๋ค ์ ์์ด์ผ ํ๋๋ผ๊ตฌ์! ๊ทธ๋์ ์ ๋๊ฐ์ง ํจ์๋ฅผ ๋ฃ์ด์ฃผ์์ต๋๋ค.
// MARK: - toDate ํจ์
extension String {
// String -> Date ๋ก ๋ณ๊ฒฝํ๋ ํจ์
func toDate() -> Date? {
let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "yy.MM.dd"
if let date = dateFormatter.date(from: self) {
return date
} else {
return nil
}
}
}
// MARK: - toString ํจ์
extension Date {
// Date -> String ์ผ๋ก ๋ณ๊ฒฝํ๋ ํจ์
func toString() -> String {
let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "yy.MM.dd"
return dateFormatter.string(from: self)
}
}
โ๏ธ ์๋ก์ด ํญ ๋ฐ๋ฅผ ์์ฑํด ์บ๋ฆฐ๋ ๊ตฌํ
์บ๋ฆฐ๋ ๊ธฐ๋ฅ์ ๋ฃ๊ณ ์ถ์ด์ ๊ตฌ๊ธ๋ง์ ๋ค์ ๋ค์ ํด๋ดค๋๋ Swift์๋ UICalendarView๋ผ๋ ํด๋์ค๋ก ์บ๋ฆฐ๋ ๊ตฌํ์ ์์ฃผ ์ฝ๊ฒ ํ ์ ์๋๋ผ๊ตฌ์! ๊ทธ๋์ ๋ค๋ฅธ ๋ถ์ ์ฝ๋๋ฅผ ์ข ์ฐจ์ฉํด์ ์บ๋ฆฐ๋๋ฅผ ๊ตฌํํด๋ณด์์ต๋๋ค.
โ๏ธ TodoList์ ์๋ก์ด Todo๋ฅผ ์์ฑํ ๋, Date ์ ๋ ฅ ๋ฐ์์ค๊ธฐ / ์๋ก์ด ViewController๋ฅผ ์์ฑ ( ์๋ก์ด Todo ์์ฑ )
์๋ก์ด Todo๋ฅผ ์ ๋ ฅํ๋ ์ผ๋ฟ์ฐฝ์์ Date ๊ฐ๋ ๋ฐ์์ค๊ณ ์ถ์๋๋ฐ, ์ผ๋ฟ์ฐฝ์ textfield ์ Date Picker View ๋ฅผ ๋์์ ์ฌ๋ฆด ์๊ฐ ์๋๋ผ๊ตฌ์.. ๊ทธ๋ฅ ์ ๊ฐ ๋ชปํ๊ฑด์ง ์๋ ์๋ ์๋๋ ๊ฑด์ง.. ๊ทธ๋์ ์ด์ฉ ์ ์์ด ์๋ก์ด ViewController๋ฅผ ๋ง๋ค์ด์ผํ์ต๋๋ค.
Add ๋ฒํผ์ ๋๋ ์ ๋, ๋ฐ์์ ์๋ก ์ฌ๋ผ์ค๋๋ก ์ฝ๋๋ก ๋ทฐ์ปจ์ ์ฐ๊ฒฐํด์ฃผ์์ต๋๋ค. Date๊ฐ๋ ๋ฌด์ฌํ ๋ฐ์์ค๊ธฐ๋ฅผ ์๋ฃ!
์๋ก์ด ๋ฐ์ดํฐ๋ฅผ ์์ฑํ๋๋ฐ ์์ด์ Date๊ฐ๋ ์๊ฒจ์ ๋ฐ์ดํฐ ๋งค๋์ ์ saveTodoListData์ ํจ์๋ title๊ณผ Date ๋ ๊ฐ์ง ๋ฐ์ดํฐ๋ฅผ ๋ฐ์์์ ์๋ก์ด ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๋ ๊ฒ์ผ๋ก ๋ฐ๊พธ์ด์ฃผ์์ต๋๋ค.
๊ทผ๋ฐ ์ฌ๊ธฐ์ Done์ ๋๋ ์ ๋, ๊ธฐ์กด ํ๋ฉด์ผ๋ก ๋์ด๊ฐ๋ ๊ณผ์ ์์ ์ถ๊ฐํ ๋ฐ์ดํฐ๊ฐ ๋ฐ๋ก todoList์ ์ฌ๋ผ์์ผํ๋๋ฐ ์์ฌ๋ผ์์ง๋๋ผ๊ตฌ์ใ ใ ๊ทธ๋์ ์ด ๋ถ๋ถ์ ํด๋ก์ ํจ์๋ฅผ ์ด์ฉํด์ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๋ ์๊ฐ์ ์๋ฃ๋ ๋ฉ์์ง๋ฅผ ๋ณด๋ด์ฃผ์ด์ ์๋กญ๊ฒ ํ ์ด๋ธ ๋ทฐ๋ฅผ ์ ๋ฐ์ดํธ ํ๋ ๊ฒ์ผ๋ก ํด๊ฒฐ์ ํ์์ต๋๋ค. ์ด ๋ถ๋ถ์์ ๊ต์ฅํ ๋ง์ ์๊ฐ์ ํ๋ ์ด์..!
์ด ๋ ์ ๊ฟํ..! ์ฝ๋ ์คํ์ด ์๋๋ค๋ฉด ์ฝ๋ ์คํ์ด ๋๋์ง ์๋๋์ง ๋ถํฐ ํ์ ํด์ผํ๊ธฐ ๋๋ฌธ์ ๊ผญ ํจ์๋ฅผ ์คํ์์ผ๋ด๋ผ..! ์ด์ ํจ์ ์คํ ๊ผญ ํด๋ณด๋ ค๊ตฌ์..!!
@IBAction func doneButtonTapped(_ sender: UIButton) {
guard let text = titleTextField.text else { return }
let date = datePickerView.date
if text != "" {
dataManager.saveTodoListData(todoTitle: text, todoDate: date) {
print("์๋ก์ด ๋ฐ์ดํฐ ์ ์ฅ ์๋ฃ")
self.saveData()
}
}
dismiss(animated: true, completion: nil)
}
// ๋ฐ์ดํฐ ์ ์ฅ์ด ์๋ฃ๋ ํ ํธ์ถ๋๋ ๋ฉ์๋
func saveData() {
// ๋ฐ์ดํฐ ์ ์ฅ ์๋ฃ๋ฅผ ์๋ฆฌ๋ ์๋ฆผ ๋ฐ์ก
NotificationCenter.default.post(name: NSNotification.Name(rawValue: "DataSaved"), object: nil)
}
์ด๋ ๊ฒ AddViewController ์์ ๋ฐ์ดํฐ๊ฐ ์ ์ฅ์ด ์๋ฃ๋์์ ๋, saveData๋ฅผ ํธ์ถํ๋ฉด saveData๊ฐ ์๋ฆผ์ ๋ฐ์กํ์ฌ ์ค๋๋ค. ๊ทธ ์๋ฆผ์ ๋ฐ๋ ์น๊ตฌ๋ tableView๋ฅผ ๊ฐ์ง๊ณ ์๋ ViewController์์!
override func viewDidLoad() {
super.viewDidLoad()
setting()
setTitle()
buttonAction()
setDate()
NotificationCenter.default.addObserver(self, selector: #selector(dataSaved), name: NSNotification.Name(rawValue: "DataSaved"), object: nil)
}
// ๋ฐ์ดํฐ ์ ์ฅ ์๋ฃ ์๋ฆผ์ ๋ฐ์์ ๋ ํธ์ถ๋๋ ๋ฉ์๋
@objc func dataSaved() {
// UITableView ๋ค์ ๊ทธ๋ฆฌ๊ธฐ
print(#function)
tableview.reloadData()
}
์ฌ๊ธฐ๊ฐ ViewController ์ ๋๋ค!
โ๏ธ TodoList์ ๋ ์ง ๋ณ๋ก ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ด / ๋ ์ง๊ฐ ๋์ด๊ฐ์ ๋, ๋ฐ์ดํฐ๊ฐ ๋ฐ๋์ด์ ์๋ก table view๊ฐ ์์ฑ
์ด์ TodoList์ ๋ฐ์ดํฐ๋ฅผ ๋ ์ง ๋ณ๋ก ์ ๋ฆฌํด์ ๊ฐ์ ธ์ค๋๋ก ๋ง๋ค์์ด์! ๊ฐ์ ธ์จ ๋ฐ์ดํฐ๋ฅผ date๋ฅผ key๋ก ๊ฐ์ง๋ ๋์ ๋๋ฆฌ๋ฅผ ๋ง๋ค์ด์ ๋ฐฐ์ด ํ์์ผ๋ก ์ ๋ฆฌํด์ ๋ฃ์ด์ฃผ์์ต๋๋ค.
func fetchDataByDate() -> [String: [NSManagedObject]] {
if let context = context {
// NSFetchRequest ์์ฑ
let fetchRequest = NSFetchRequest<NSFetchRequestResult>(entityName: self.modelName)
// ๋ ์ง๋ณ๋ก ์ ๋ ฌํ๊ธฐ ์ํ ์์ฑ ์ถ๊ฐ
fetchRequest.sortDescriptors = [NSSortDescriptor(key: "priority", ascending: true)]
do {
// ๋ฐ์ดํฐ ๊ฐ์ ธ์ค๊ธฐ
let fetchedResults = try context.fetch(fetchRequest) as! [NSManagedObject]
// ๋ ์ง๋ณ๋ก ๋ฐ์ดํฐ ์ ๋ฆฌ
var dataByDate: [String: [NSManagedObject]] = [:]
let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "yy.MM.dd"
for data in fetchedResults {
if let date = data.value(forKey: "date") as? Date {
let dateString = dateFormatter.string(from: date)
if dataByDate[dateString] == nil {
dataByDate[dateString] = []
}
dataByDate[dateString]?.append(data)
}
}
return dataByDate
} catch {
print("Error fetching data: \(error)")
}
}
return [:]
}
UI์์ ๋ฐ์ดํฐ๋ฅผ ๋๊ธฐ๊ธฐ์ํด์ ํ์ดํ ๋ฒํผ์ ์์ฑํด ๋ฐ์ดํฐ๋ฅผ ๋์ด๊ฐ๋๋ก ๊ตฌํ๋ ํด์ฃผ์์ด์!
@IBAction func backButtonTapped(_ sender: UIButton) {
// ํ์ฌ pageDate์์ ํ๋ฃจ ์ ์ผ๋ก ๋ณ๊ฒฝ
if let date = pagedate.toDate() {
let changedDate = Calendar.current.date(byAdding: .day, value: -1, to: date)
if let toStringDate = changedDate?.toString() {
pagedate = toStringDate
}
}
changeDate()
}
// MARK: - FrontButton
@IBAction func frontButtonTapped(_ sender: UIButton) {
// ํ์ฌ pageDate์์ ํ๋ฃจ ํ๋ก ๋ณ๊ฒฝ
if let date = pagedate.toDate() {
let changedDate = Calendar.current.date(byAdding: .day, value: 1, to: date)
if let toStringDate = changedDate?.toString() {
pagedate = toStringDate
}
}
changeDate()
}
date๋ฅผ ๊ธฐ์ค์ผ๋ก ์ ์ ๋ฐ์ดํฐ๋ฅผ ์ฌ๋ฆฌ๊ธฐ ๋๋ฌธ์ date๋ง ๋ณํ์์ผ์ฃผ๋ ํจ์๊ฐ ์์ผ๋ฉด ์ ๋ ๋ณ๊ฒฝ์ด ๋๋ ๊ฑฐ์ฃ !
// ํ์ด์ง ๋ ์ง ์ ์ฅ
var pagedate: String = ""
// ๊ธฐ๋ณธ ๋ ์ง ์ค๋๋ก ์ค์ ํ๊ธฐ
func setDate() {
let now = Date()
let formatter = DateFormatter()
formatter.dateFormat = "yy.MM.dd"
pagedate = formatter.string(from: now)
// UILabel ์ค์
date.text = pagedate
}
// ๋ ์ง ๋ณ๊ฒฝํ๊ธฐ
func changeDate() {
// UILabel ์ค์
date.text = pagedate
self.tableview.reloadData()
}
pageDate ๋ณ์๋ฅผ ๋ง๋ค์ด์ ์ค๋ ๋ ์ง๋ฅผ ๊ธฐ๋ณธ์ผ๋ก ์ค์ ํด๋๊ณ , ๋ ์ง๊ฐ ๋ณ๊ฒฝ๋ ๋๋ง๋ค ์๋กญ๊ฒ Date๋ฅผ ๊ทธ๋ฆฌ๋๋ก ์ค์ ํ์์ต๋๋ค.
[ ์ฌ๋ฌ๊ฐ์ง์ ์ค๋ฅ ]
์ค๋ ์ด๋ค ์ค๋ฅ๋ค์ ๋ง๋ฅ๋ค์ด๊ณ ์ด๋ป๊ฒ ํด๊ฒฐํ์๋์ง ์ ๋ฆฌํด๋ด ์๋ค.
โ๏ธ ์ฒ์ ํ๋ฉด์ ๋ค์ด์์ ๋, ์ฒดํฌ๋ฐ์ค ํ์๊ฐ ๋์ด์์ง ์๋ ์ค๋ฅ -> ํด๊ฒฐ
์ด ๋ถ๋ถ์ ์ฒ์์ cell์ ๋ฐ์ดํฐ๋ฅผ ํ์ํ ๋๋ถํฐ data์ ischecked์ ๋ฐ๋ผ ๋ฒํผ์ UI๋ฅผ ์ค์ ์ ํด์ฃผ์์ด์ผ ํ๋๋ฐ, ๋นผ๋จน์ ์ ์ ๋ถ์ฐฐ์ด์์ต๋๋ค. ๊ทธ๋์ ํจ์๋ฅผ ๋ง๋ค์ด์ ์ค๋ฅ๋ฅผ ํด๊ฒฐํด์ฃผ์์ด์.
// ToDoData๋ฅผ ์ ๋ฌ๋ฐ์ ๋ณ์
var toDoData: TodoData? {
didSet {
configureUIwithData()
}
}
// TodoData๋ก UI ํ์
func configureUIwithData() {
todoText.text = toDoData?.title
setTableViewCell()
}
func setTableViewCell() {
if let ischecked = toDoData?.isChecked {
if ischecked == true {
checkButton.isSelected = true
todoText.textColor = UIColor.darkGray
todoText.attributedText = todoText.text?.strikeThrough()
}else {
checkButton.isSelected = false
todoText.textColor = UIColor.black
todoText.attributedText = todoText.text?.removeStrikeThrough()
}
}
}
setTableViewCell() ์ด๋ผ๋ ์๋ก์ด ํจ์๋ฅผ ๋ง๋ค์ด์ ์ฒ์ ๋ฐ์ดํฐ์ ๋ฐ๋ฅธ UI๋ณ๊ฒฝ์ ํด์ฃผ์๊ตฌ์. ์ด ๊ฒ์ TodoData๋ฅผ ๋ฐ์ ๋๋ง๋ค ์คํ์์ผ์ฃผ๋๋ก ์ฝ๋๋ฅผ ๊ตฌํํ์ต๋๋ค!
โ๏ธ priority๊ฐ ๋๋ง ๋ฐ๋๋ ์ค๋ฅ -> ๋ฏธํด๊ฒฐ
์ด ๋ถ๋ถ์ ์ ๊ฐ ๊ธฐ๋ฅ์ ์ผ๋ก ์ฐฉ๊ฐํด์ ํ์ ์์น๊ฐ ๋ฐ๋๋ฉด ๋์ priority๋ง ๋ฐ๋๋ฉด ๋๋ค๊ณ ์๊ฐํ๋๋ฐ, ๊ทธ๊ฒ ์๋๋๋ผ๊ตฌ์. ๊ทธ ์ฌ์ด์ ์๋ priority๊ฐ ๋ค ๋ฐ๋ ค๋์ผํ๋๋ฐ, ๊ทธ๋ผ ๊ทธ ์ฌ์ด์ ๋ฐ์ดํฐ๋ฅผ ๋ค ๋นผ์์ผํด์ ๊ทธ๊ฑธ ์ด๋ป๊ฒ ๊ตฌํํด์ผํ ์ง ๊ณ ๋ฏผํ๋ค๊ฐ ์์ง ๊ตฌํ์ ๋ชปํ์ด์. ๋ด์ผ ๊ตฌํํด๋ณผ๊นํฉ๋๋ค!
โ๏ธ ์๋์๋ TodoList๋ฅผ ์์ ํ์ ๋, ๋ค๋ฅธ ์ทจ์์ ๋ค์ด ๋ณํ๋ ์ค๋ฅ -> ํด๊ฒฐ
์ด๊ฑด ์ฒซ ๋ฒ์งธ ์ค๋ฅ๋ฅผ ์์ ํ๋ ์๋์ ์ผ๋ก ์์ ์ด ๋์์ต๋๋ค!
โ๏ธ TodoList์ ์๋ก์ด Todo๋ฅผ ์์ฑํ ํ์ธ๋ฒํผ์ ๋๋ ์ ๋, ํ ์ด๋ธ ๋ทฐ์ ๋ฐ์ดํฐ๊ฐ ๋ค์ ์ ๋ฐ์ดํธ ๋์ง ์๋ ์ค๋ฅ -> ํด๊ฒฐ
์ด ๋ถ๋ถ์ TodoList์ ์๋ก์ด Todo๋ฅผ ์์ฑํ ๋, Date ์ ๋ ฅ ๋ฐ์์ค๊ธฐ / ์๋ก์ด ViewController๋ฅผ ์์ฑ ( ์๋ก์ด Todo ์์ฑ ) ๋ถ๋ถ์์ ํด๊ฒฐ์ ํ์์ด์!!ใ ใ
[ ํด๊ฒฐํ๊ฑฐ๋ ๊ตฌํํด์ผํ ๊ฒ ]
- Editting ๋ชจ๋์์ Cell์ ๋๋ ์ ๋, AddTodo ํ๋ฉด์ผ๋ก ๋์ด๊ฐ๋ฉด์ ๋ฐ์ดํฐ ๋๊ธฐ๊ธฐ
- Cell๋ก AddTodo ํ๋ฉด์ผ๋ก ๋์ด๊ฐ์ ๋, ์ ๋ชฉ๋ณ๊ฒฝ, TextField ์์ ๊ธฐ์กด Title๋ฃ๊ธฐ, ๊ธฐ์กด Date ๊ฐ ๋ฃ๊ธฐ, ๋ฒํผ ์ด๋ฆ "์์ "์ผ๋ก ๋ณ๊ฒฝํ๊ธฐ
- ์นดํ ๊ณ ๋ฆฌ ๋ง๋ค์ด์ ์์ ์ง์ ํ๊ธฐ
- ๋ฐ์ดํฐ์ ์์๋ฐ์ดํฐ ๋ฃ๊ธฐ
- AddTodo ํ๋ฉด์์ ์์ Piker ํ๋ฉด ๊ตฌํํ๊ธฐ
- TodoList์ todo ํญ๋ชฉ์ ๋ค ์๋ฃํ๋ค๋ฉด ์บ๋ฆฐ๋์ ์๋ฃ ํ์ ๋ฃ๊ธฐ
- ์บ๋ฆฐ๋์์ ๋ ์ง๋ฅผ ์ ํํ๋ฉด ํด๋น ๋ ์ง์ Todo ๋ฆฌ์คํธ๋ก ์ด๋ํ๊ธฐ
- todolist๋ฅผ ์ญ์ ํ ๋, ์ญ์ ํ์๊ฒ ์ต๋๊น๋ผ๋ ์ผ๋ฟ์ฐฝ ๋์ฐ๊ธฐ
- ๋ชฉ์ฐจ ๋ณ๊ฒฝํ๋ ๊ธฐ๋ฅ ์์ ๊ธฐ
์ ๊ฐ ์์ผ๋ก ๋จ์ 1์ฃผ์ผ๋์ ๊ณ ๋ฏผํ๊ณ ๊ตฌํํด์ผํ ๋ถ๋ถ์ ๋๋ค..!!
์ฒ์ ์ฒซ ๊ตฌํ ์ฑ์ด๋ผ์ ๋๋์ฑ ์ ์ฐฉ์ด ๊ฐ๋๋ค..!
๊ผญ ์ฑ ์ถ์๊น์ง ์ฑ๊ณตํ ์ ์๊ธฐ๋ฅผ..!!
์ค๋์ ์ผ์ฃผ์ผ๋์ ์ง์ง ์ต์ ์ ๋คํด ๊ณต๋ถํ ๋ ์์ ์ ์ํด ๋งฅ์ฃผํ์บ ๋จน๊ณ ์๋๋ก ํ๊ฒ ์ต๋๋ค.\
๊ทธ๋ผ ๋ค๋ค ์๋ ~~๐ป