최근에 nodeJS를 공부해야하는 일이 있어서 그것만 집중 공부하다보니(?)
swift에 많이 손을 못 대서 다시 복습하고자
클론코딩을 최대한 안하고 todolist를 만들어봤다!!
클론코딩만 하던 나에게 있어서 안보고 만들 수 있었다는건 내게 자신감을 심어줬다!!
'+' 를 누르면 알림창이 뜨면서 textField에 todo를 적으면 뷰에 보여준다!
여기서 중요한거는 어플이 종료되도 내용은 내부에 남아있게 하는게 핵심적인 내용이었다!!
매우 짧지만 추가라는 내용이 잘 담겨져있다(내가 봐도..ㅎㅎ)
일단 테이블을 만들어서 어떤 셀을 쓸 건지 등록 해놨다.
내용들을 저장할 items를 문자열 배열로 생성!
테이블에서 셀이 몇개나 필요한지, 어떻게 내보낼지 적어줘야해서 tableDataSource를 적극적 사용!!
UserDefaults.standard를 사용해서 +한 내용을 items뿐 아니라 내부에도 저장!
class ViewController: UIViewController {
//todolist를 만들건데 기능은 추가만있다 그리고 이건 내부에 계속 저장하게 만들 예정!
private let table: UITableView = {
let table = UITableView()
table.register(UITableViewCell.self, forCellReuseIdentifier: "cell")
return table
}()
var items = [String]()
// var items:[String]
// private let table: UITableView = {}()
override func viewDidLoad() {
super.viewDidLoad()
title = "To Do List"
self.items = UserDefaults.standard.stringArray(forKey: "items") ?? []
view.addSubview(table)
table.dataSource = self
navigationItem.rightBarButtonItem = UIBarButtonItem(barButtonSystemItem: .add, target: self, action: #selector(didTapAdd))
}
override func viewDidLayoutSubviews() {
super.viewDidLayoutSubviews()
//uiview layout은 화면에서 뷰의 크기와 위치를 말한다 모든 view는 frame을 가지고 있다
// 뷰가 서브뷰의 배치를 다했다는 소식을 뷰컨트롤러에게 알리는거!
// 테이블의 데이터를 reload 그리고 뷰들의 크기나 위치를 조정
table.frame = view.bounds
}
@objc private func didTapAdd() {
let alert = UIAlertController(title: "New Item", message: "Enter new todo list item!", preferredStyle: .alert)
alert.addTextField {
textfield in
textfield.placeholder = "Enter item..."
}
alert.addAction(UIAlertAction(title: "Cancel", style: .cancel, handler: nil))
alert.addAction(UIAlertAction(title: "Done", style: .default, handler: { [weak self] _ in
if let field = alert.textFields?.first {
//한 텍스트 필드의 전체 텍스트가 들어가있는게 first다!!
if let text = field.text, !text.isEmpty {
DispatchQueue.main.async {
var currentItems = UserDefaults.standard.stringArray(forKey: "items") ?? []
currentItems.append(text)
UserDefaults.standard.set(currentItems, forKey: "items")
self?.items.append(text)
self?.table.reloadData()
}
}
}
}))
present(alert, animated: true)
}
}
extension ViewController: UITableViewDataSource {
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath)
// indexpath => [section.row] 이루어진 행을 식별하는 경로!
cell.textLabel?.text = items[indexPath.row]
return cell
}
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return items.count
}
}
블로그를 들어가보면서 내용에 대해 더 깊게 찾아보고 공부를 하다보니 LifeCycle이 항상 나왔다
이건 매일 유튜브 보듯이 찾아보고 자연스럽게 머리에 저장하자!!