โœ๏ธ TIL

[ TIL ] ๋Š˜์–ด๋‚˜๋Š” ๊ธฐ๋Šฅ๊ณผ ๊ทธ์™€ ํ•จ๊ป˜ ๋Š˜์–ด๊ฐ€๋Š” ์˜ค๋ฅ˜ / 24๋…„ 3์›” 22์ผ

EarthSea 2024. 3. 22. 23:20

์ถœ์ฒ˜ : ํ•€ํ„ฐ๋ ˆ์ŠคํŠธ

 

์•ˆ๋…•ํ•˜์„ธ์š”!

์˜ค๋Š˜ ํ•˜๋ฃจ๋Š” ์–ด๋• ๋ƒ๋ฉด์š”..

๋Š˜์–ด๋‚˜๋Š” ๊ธฐ๋Šฅ ์š•์‹ฌ๊ณผ ๊ทธ์™€ ํ•จ๊ป˜ ๋Š˜์–ด๋‚˜๋Š” ์˜ค๋ฅ˜๋“ค์„ ์ฒ˜๋ฆฌํ•˜๊ณ  ์ˆ˜์Šตํ•˜๊ธฐ์— ๊ธ‰๊ธ‰ํ–ˆ์Šต๋‹ˆ๋‹ค.

 

 

[ ์ƒˆ๋กญ๊ฒŒ ๊ตฌํ˜„ํ•œ ๊ธฐ๋Šฅ๋“ค ] 

 

โ˜‘๏ธ 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์ฃผ์ผ๋™์•ˆ ๊ณ ๋ฏผํ•˜๊ณ  ๊ตฌํ˜„ํ•ด์•ผํ•  ๋ถ€๋ถ„์ž…๋‹ˆ๋‹ค..!!

์ฒ˜์˜ ์ฒซ ๊ตฌํ˜„ ์•ฑ์ด๋ผ์„œ ๋”๋”์šฑ ์• ์ฐฉ์ด ๊ฐ‘๋‹ˆ๋‹ค..!

๊ผญ ์•ฑ ์ถœ์‹œ๊นŒ์ง€ ์„ฑ๊ณตํ•  ์ˆ˜ ์žˆ๊ธฐ๋ฅผ..!!

์˜ค๋Š˜์€ ์ผ์ฃผ์ผ๋™์•ˆ ์ง„์งœ ์ตœ์„ ์„ ๋‹คํ•ด ๊ณต๋ถ€ํ•œ ๋‚˜ ์ž์‹ ์„ ์œ„ํ•ด ๋งฅ์ฃผํ•œ์บ” ๋จน๊ณ  ์ž๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.\

๊ทธ๋Ÿผ ๋‹ค๋“ค ์•ˆ๋…•~~๐Ÿป