[Swift-UIKit]메모 만들기 코드

sai06266·2023년 8월 27일

Swift

목록 보기
6/10

MemoTableViewController.swift

import UIKit

class MemoTableViewController: UITableViewController {
	//날짜 생성
    let formatter: DateFormatter = {
     let f = DateFormatter()
     f.dateStyle = .long
     f.timeStyle = .short
     f.locale = Locale(identifier: "Ko_kr")
    return f
    }()
    
    @IBOutlet var MemoList: UITableView!
    override func viewDidLoad() {
        super.viewDidLoad()
        // Uncomment the following line to preserve selection between presentations
        // self.clearsSelectionOnViewWillAppear = false

        // Uncomment the following line to display an Edit button in the navigation bar for this view controller.
        self.navigationItem.leftBarButtonItem = self.editButtonItem
    }
    
    //바뀐 목록을 reloading
    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)
        tableView.reloadData()
    }
    override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        // #warning Incomplete implementation, return the number of rows
        return Memo.MemoList.count
    }
    //메모를 읽어 목록을 표시
    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "myCell", for: indexPath)
        //cell.textLabel?.text = memos[(indexPath as NSIndexPath).row]
        let target = Memo.MemoList[indexPath.row] // tableView에서 몇번쨰 cell인지 확인 가능
        cell.textLabel?.text = target.content
        cell.detailTextLabel?.text = formatter.string(from: target.insertDate)
        
        return cell
    }
    //선택된 메모의 정보를 넘김
    override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        let selectedMemo = Memo.MemoList[indexPath.row]
        if let editVC = storyboard?.instantiateViewController(withIdentifier: "MemoEditViewController") as? MemoEditViewController {
            editVC.memoToEdit = selectedMemo
            editVC.delegate = self // 델리게이트 설정
            navigationController?.pushViewController(editVC, animated: true)
        }
    }
    //셀의 내용 왼쪽으로 밀어서 삭제
    override func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCell.EditingStyle, forRowAt indexPath: IndexPath) {
        if editingStyle == .delete {
            // Delete the row from the data source
            Memo.MemoList.remove(at: (indexPath as NSIndexPath).row)
            tableView.deleteRows(at: [indexPath], with: .fade)
        } else if editingStyle == .insert {
            // Create a new instance of the appropriate class, insert it into the array, and add a new row to the table view
        }    
    }
    //delete → 삭제
    override func tableView(_ tableView: UITableView, titleForDeleteConfirmationButtonForRowAt indexPath: IndexPath) -> String? {
        return "삭제"
    }
    //목록 순서 바꾸기
    // Override to support rearranging the table view.
    override func tableView(_ tableView: UITableView, moveRowAt fromIndexPath: IndexPath, to: IndexPath) {
        let memoToMove = Memo.MemoList[(fromIndexPath as NSIndexPath).row]
        Memo.MemoList.remove(at: (fromIndexPath as NSIndexPath).row)
        Memo.MemoList.insert(memoToMove, at: (to as NSIndexPath).row)
    }
}
//프로토콜 정의
extension MemoTableViewController: MemoEditDelegate {
    func memoEditViewController(_ controller: MemoEditViewController, didFinishEditing updatedMemo: Memo) {
        if let index = Memo.MemoList.firstIndex(where: { $0 === updatedMemo }) {
            tableView.reloadRows(at: [IndexPath(row: index, section: 0)], with: .automatic)
        }
    }
}

AddViewController.swift

import UIKit

class AddViewController: UIViewController {

    @IBOutlet var memoText: UITextView!
    override func viewDidLoad() {
        super.viewDidLoad()
    }

    @IBAction func btnAdd(_ sender: UIBarButtonItem) {
        let memo = memoText.text
        let newMemo = Memo(content: memo ?? "")
        Memo.MemoList.append(newMemo)
        
        _ = navigationController?.popViewController(animated: true)
    }
    
}

MemoEditViewController

import UIKit

//메모가 수정되었음을 알리는 프로토콜
protocol MemoEditDelegate: AnyObject {
    func memoEditViewController(_ controller: MemoEditViewController, didFinishEditing updatedMemo: Memo)
}
class MemoEditViewController: UIViewController {

    @IBOutlet var memoTextView: UITextView!
    //delegate를 통해 메모가 수정되었음을 다른 뷰에게 알림
    weak var delegate: MemoEditDelegate?
    //메모의 정보를 받는 변수 추가
    var memoToEdit: Memo!
    override func viewDidLoad() {
        super.viewDidLoad()
        //수정하기 전 메모의 내용 표시
        memoTextView.text = memoToEdit.content
    }
    
    @IBAction func btnSave(_ sender: UIBarButtonItem) {
        guard let updatedContent = memoTextView.text, !updatedContent.isEmpty else {
            return
        }
        memoToEdit.update(content: updatedContent)
        delegate?.memoEditViewController(self, didFinishEditing: memoToEdit)
        //이전 화면으로 돌아가기
        navigationController?.popViewController(animated: true)
    }
}

model.swift(메모 저장용)

class Memo {
    var content : String
    var insertDate : Date
    
    init(content : String) {
        self.content = content
        insertDate = Date()
    }
    //메모 리스트
    static var MemoList = [
        Memo(content: "첫번째 메모"),
        Memo(content: "두번째 메모")
    ]
    //메모 수정관련 함수
    func update(content: String) {
        self.content = content
        insertDate = Date() // 수정 날짜 갱신
    }
}

0개의 댓글