見出し画像

Swiftで行こう!TableView(TodoList)

Tableの作り方をもう少しやっていきます。Todoリストを作成するときに必要な機能を作っていきます。

テーブルのレイアウトなどだいたいは前に書いているのを参考にしてもらえればと思います。

追加ボタンをつけるときは

な感じでボタンを作ります。

まずテーブルに入れるデータの構造を考えていきます。

class Item{
       var title :String
       var done:Bool = false    
       init(title:String){
           self.title = title
       }   
   }

classで作ります。内容としては、

title やること。
done チェックの有無

を決めています。

実際には

var itemArr: [Item] = []

として"やること(title)"を配列に入れていきます。

まず最初にデータを入れておきます。

 override func viewDidLoad() {
    super.viewDidLoad()
    let item1 = Item(title: "買い物")
    let item2 = Item(title: "ジョギング")
       
    itemArr.append(item1)
    itemArr.append(item2)
 
   }

起動時に読み込ませます。

気をつけないといけないとこは

   override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
       let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath)
       let item = itemArr[indexPath.row]
       cell.textLabel?.text = item.title
       cell.accessoryType = item.done ? .checkmark : .none
       return cell
   }

の部分では

cell.accessoryType = item.done ? .checkmark : .none

ですね。チェックを入れる時にかくコードです。cell.accessoryType

ですね。今回は .checkmarkです。ここでセットしておいて、

override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
       let item = itemArr[indexPath.row]
       item.done.toggle() 
       self.tableView.reloadData()
       tableView.deselectRow(at: indexPath, animated: true)
       
   }

ここでセルを選択したときにチェックを付けることになります。

trueとfalseとを入れ替える命令ですが

item.done = !item.done   これまで
item.done.toggle()     Swift 4.2から使えます。

となっています。あと選択する時に通常であれば背景に色がつきますが、

tableView.deselectRow

を追加することで背景色が無くなります。

こんな感じでチェックできます。

データの追加をするコードは

@IBAction func addTask(_ sender: Any) {
       
           var textField = UITextField()
           let alert = UIAlertController(title: "item add", message: "追加します", preferredStyle: .alert)
       
           let action = UIAlertAction(title:"add",style: .default){(action) in
           
           let Newitem:Item = Item(title:textField.text!)
           self.itemArr.append(Newitem)
           self.tableView.reloadData()
          }
  
           let cancel = UIAlertAction(title: "cancel", style: .cancel){(action)  in
           print("Cancel")
          }
       
           alert.addTextField { (alertTextField) in
           alertTextField.placeholder = ""New Task!"
           textField = alertTextField   
           alert.addAction(action)
           alert.addAction(cancel)    
           self.present(alert, animated: true, completion: nil)  
       }
   }

ここではUIAlertControllerを使ってポップアップで入力画面を出します。

実際にデータを入れるコードは、

let Newitem:Item = Item(title:textField.text!)
self.itemArr.append(Newitem)
self.tableView.reloadData()

ですね。class Itemのインスタンスを作り配列itemArrに追加していきます。そして、tableView自体をリロードしてテーブルに反映させます。

 let cancel = UIAlertAction(title: "cancel", style: .cancel){(action)  in
            }

取り消す時のコードです。

UIAlertActionを反映させるのには、

alert.addAction(action)   ・・データの追加
alert.addAction(cancel)   ・・キャンセル
self.present(alert, animated: true, completion: nil) ・・alertを表示させる

が必要です。

ついでに

alert.addTextField { (alertTextField) in
alertTextField.placeholder = "新しいアイテム"
textField = alertTextField

ではプレースフォルダということで入力前に薄く表示させておいて、入力をわかりやすくします。

最後にいらないタスクの削除ということで、

 override func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCell.EditingStyle, forRowAt indexPath: IndexPath) {
       itemArr.remove(at: indexPath.row)
       let indexPaths = [indexPath]
       tableView.deleteRows(at: indexPaths, with: .automatic)
   }

これで該当せるをスワイプするとDelete表示がされ消すことが可能となります。

全コードです。


この記事が気に入ったらサポートをしてみませんか?