ios개발자를 위한 여정 -5

박경현·2022년 6월 4일
0

최근에 nodeJS를 공부해야하는 일이 있어서 그것만 집중 공부하다보니(?)
swift에 많이 손을 못 대서 다시 복습하고자

클론코딩을 최대한 안하고 todolist를 만들어봤다!!

클론코딩만 하던 나에게 있어서 안보고 만들 수 있었다는건 내게 자신감을 심어줬다!!

화면 설명

'+' 를 누르면 알림창이 뜨면서 textField에 todo를 적으면 뷰에 보여준다!

여기서 중요한거는 어플이 종료되도 내용은 내부에 남아있게 하는게 핵심적인 내용이었다!!

코드 순서 및 설명

매우 짧지만 추가라는 내용이 잘 담겨져있다(내가 봐도..ㅎㅎ)

  1. 일단 테이블을 만들어서 어떤 셀을 쓸 건지 등록 해놨다.

  2. 내용들을 저장할 items를 문자열 배열로 생성!

  3. 테이블에서 셀이 몇개나 필요한지, 어떻게 내보낼지 적어줘야해서 tableDataSource를 적극적 사용!!

  4. 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이 항상 나왔다

이건 매일 유튜브 보듯이 찾아보고 자연스럽게 머리에 저장하자!!

profile
SW로 문제를 해결하려는 열정만 있는 대학생

0개의 댓글