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() // 수정 날짜 갱신
}
}