[ToyProject]ToDoList(登録保留中)


🍎 To Do List



🍏 機能の詳細

  • Table Viewでは、やるべきことを追加できます.
  • 件の保留事項を削除できます.
  • 日の優先順位を再設定できます.
  • で行うべきことをデータ・リポジトリに格納し、アプリケーションの再実行時にデータを保持します.
  • 🍏 テクノロジーを活用

  • UItableView:複数セル、1列複数行、
  • のみ垂直スクロール
  • UIAlertController
  • UserDefaults
  • 🍏 機能実装


    FullCode_github_ToDoList
    1.基礎UI設計

    作成
  • NavigationControl
  • 「Bar Button Item」オブジェクトを
  • 本のビューBarに配置し、プロパティインスペクタでシステムItemを「Edit」
  • に設定します.
  • Barボタンの右上隅にボタンを追加し、「Add」
  • に設定します.
  • Table Viewを追加し、画面
  • を満たすようにConstraintsを設定します.
  • プロパティインスペクタでPrototype Cellの値を設定すると、そのセルはビューに表示され、そのセルのスタイルがカスタマイズされている場合は、必要な設計を行うことができます.また、デフォルトのシステム設定値を使用します.
  • 今はプロジェクトでやるべきことを見ればいいので、
  • を基本に設定します
    2.コード操作
  • IBOUT変数とIBACTION関数
  • を作成
    実装
  • には「Alert」が表示され、「
  • Add(+)」ボタンを押したときに必要なことを登録できます.
        @IBAction func tabAddButton(_ sender: UIBarButtonItem) {
            let alert = UIAlertController(title: "MustDo", message: nil, preferredStyle: .alert)
            let registerButton = UIAlertAction(title: "등록", style: .default, handler: { [weak self] _ in
                guard let title = alert.textFields?[0].text else { return }
                let task = Task(title: title, done: false)
                self?.tasks.append(task)
                self?.mustDoTableView.reloadData()
            })
            let cancelButton = UIAlertAction(title: "취소", style: .cancel, handler: nil)
            alert.addAction(cancelButton)
            alert.addAction(registerButton)
            alert.addTextField(configurationHandler: { textField in
                textField.placeholder = "할 일을 입력해주세요."
            })
            self.present(alert, animated: true, completion: nil)
        }
  • Alertは、通常、iOSにおいてアプリケーションまたはデバイスの状態に関する重要な情報を提供し、通常、ユーザにフィードバックを要求するために使用される.UIAlertController()でボタンを作成したり、UIAlertAction()でAlertを構成するボタンを作成したりできます.UIalertAction()にはhandlerというパラメータがあり、ボタンを押すと定義したモジュールが呼び出されます.
  • 閉パケットは参照タイプであるため、閉パケットの本文からselfでインスタンスをスナップすると、強いループ参照が発生する可能性があります.したがって、クラスインスタンス間で強いループ参照が行われないように、「弱いself」キャプチャリストを定義します.
  • UITableViewDataSourceとUITableViewDelegateプロトコル
  • を採用
    UItableViewデータソースは、テーブルビューオブジェクトの作成と変更に必要な情報を提供します.

    非伝統的な方法を実施しなければならない.
    UItableViewDelegateでは、テーブルビューの表示部分の設定、行のアクションの管理、添付ファイルビューのサポート、およびテーブルビュー内の行の編集を行うことができます.
  • CellForRowAtに問い合わせてセルに戻るメソッドブロックで、DequeueReusableCell()というメソッドを使用してキューを使用してセルを再使用します.セル数が1000個または10000個を超えると、各セルがメモリに割り当てられないため、メモリの無駄を避けるためにセルを再使用できます.
  • に加えて、削除およびソート機能は、プロトコル内の方法を用いて実施されてもよい.
  • extension ViewController: UITableViewDataSource {
        func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
            return self.tasks.count
        }
        
        func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
            let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath)
            let task = self.tasks[indexPath.row]
            cell.textLabel?.text = task.title
            if task.done {
                cell.accessoryType = .checkmark
            } else {
                cell.accessoryType = .none
            }
            return cell
        }
        
        func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCell.EditingStyle, forRowAt indexPath: IndexPath) {
            self.tasks.remove(at: indexPath.row)
            self.mustDoTableView.deleteRows(at: [indexPath], with: .automatic)
            if self.tasks.isEmpty {
                self.tabDoneButton()
            }
        }
        
        func tableView(_ tableView: UITableView, moveRowAt sourceIndexPath: IndexPath, to destinationIndexPath: IndexPath) {
            var tasks = self.tasks
            let task = tasks[sourceIndexPath.row]
            tasks.remove(at: sourceIndexPath.row)
            tasks.insert(task, at: destinationIndexPath.row)
            self.tasks = tasks
        }
    }
    
    extension ViewController: UITableViewDelegate {
        func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
            var task = self.tasks[indexPath.row]
            task.done = !task.done
            self.tasks[indexPath.row] = task
            self.mustDoTableView.reloadRows(at: [indexPath], with: .automatic)
        }
    }
  • 最後に、ユーザDefaultsは、アプリケーションのシャットダウン時にデータを保存およびロードするためにバイナリ形式でデータを格納する.
  •     func saveTasks() {
            let data = self.tasks.map {
                [
                    "title": $0.title,
                    "done": $0.done
                ]
            }
            let userDefaults = UserDefaults.standard
            userDefaults.set(data, forKey: "tasks")
        }
        
        func loadTasks() {
            let userDefaults = UserDefaults.standard
            guard let data = userDefaults.object(forKey: "tasks") as? [[String: Any]] else { return }
            // "tasks"에 대한 value가 Any?타입으로 반환되는데, 이 Any를 [[String: Any]] 로 타입캐스팅한 것.
            self.tasks = data.compactMap {
                guard let title = $0["title"] as? String else { return nil }
                guard let done = $0["done"] as? Bool else { return nil }
                return Task(title: title, done: done)
            }
        }

    🍏 に感銘を与える

  • UITableView、UserDefaultによるデータの格納とロード、DataSource&Delegateプロトコル、UIAlertControllerなど今日も新しい知識が蓄積されているようで幸せです.
  • これは、
  • のリスト形式でリストされ、そのボタンを押して次のプロジェクトのアプリケーションに入るときに使用しなければならない概念を実現しているようです.
  • を追加したい部分があります.私の場合、通常、やるべきことを記録するには、いつまでやるべきかを一緒に記録します.したがって、登録が適切な場合は、締め切り日と時間を選択し、選択した日付で各セクションを分類し、その下にセルを登録する機能を追加してみてください.