実現したいこと
cellをsegment controlのcase1からcase2に遷移したい.
遷移の仕方はcellを左スワイプしてdeleteとshareボタンでshareを押した時に行う。
ソースコード
Swift5
1import UIKit 2 3class ViewController: UIViewController,UITableViewDelegate,UITableViewDataSource { 4 5 var todos:[Item] = [] 6 7 @IBOutlet weak var Table:UITableView! 8 9 @IBAction func segmentselected(_ sender: UISegmentedControl) { 10 11 switch sender.selectedSegmentIndex { 12 13 case 0: 14 let todo = todos 15 todo 16 case 1: 17 let todo2 = todos 18 todo2 19 default: 20 fatalError("case でカバーできていません") 21 } 22 Table.reloadData() 23 } 24 25 override func viewDidLoad() { 26 super.viewDidLoad() 27 // Do any additional setup after loading the view 28 Table.delegate = self 29 Table.dataSource = self 30 31// if UserDefaults.standard.object(forKey: "todoList") != nil{ 32// todos = UserDefaults.standard.object(forKey: "todoList") as! [Item] 33// } 34 //UD読み込み 35 if let data = UserDefaults.standard.data(forKey: "todoList"){ 36 self.todos = try! NSKeyedUnarchiver.unarchiveTopLevelObjectWithData(data) as! 37 [Item] 38 } 39 40 } 41 42 func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 43 return todos.count 44 } 45 46 func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 47 48 let cell:UITableViewCell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath) 49 let item = todos[indexPath.row] 50 cell.textLabel!.text = item.title 51 return cell 52 } 53 54 func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat { 55 return view.frame.size.height/10 56 } 57 58 @IBAction func addNewTodo(_sender: Any){ 59 var textField = UITextField() 60 61 let alert = UIAlertController(title: "新しいTodoを追加", message: "", preferredStyle: .alert) 62 63 let action = UIAlertAction(title: "リストに追加", style: .default) { (action) in 64 65 let newItem:Item = Item(title: textField.text!) 66 print("追加されました") 67 68 //UD保存 69 let data = try! NSKeyedArchiver.archivedData(withRootObject: self.todos, requiringSecureCoding: false) 70 UserDefaults.standard.set(data, forKey: "todoList") 71 72 73 self.todos.append(newItem) 74 self.Table.reloadData() 75 } 76 77 alert.addTextField { (alertTextField) in 78 79 alertTextField.placeholder = "新しいTodo" 80 textField = alertTextField 81 } 82 83 alert.addAction(action) 84 present(alert, animated: true,completion: nil) 85 86 } 87 88 //swipe action 89 func tableView(_ tableView: UITableView, trailingSwipeActionsConfigurationForRowAt indexPath: IndexPath) -> UISwipeActionsConfiguration? { 90 91 // シェアのアクションを設定する 92 let shareAction = UIContextualAction(style: .normal , title: "share") { 93 (ctxAction, view, completionHandler) in 94 print("シェアを実行する") 95 completionHandler(true) 96 } 97 // シェアボタンのデザインを設定する 98 let shareImage = UIImage(systemName: "square.and.arrow.up")?.withTintColor(UIColor.white, renderingMode: .alwaysTemplate) 99 shareAction.image = shareImage 100 shareAction.backgroundColor = UIColor(red: 0/255, green: 125/255, blue: 255/255, alpha: 1) 101 102 // 削除のアクションを設定する 103 let deleteAction = UIContextualAction(style: .destructive, title:"delete") { 104 (ctxAction, view, completionHandler) in 105 self.todos.remove(at: indexPath.row) 106 tableView.deleteRows(at: [indexPath], with: .automatic) 107 completionHandler(true) 108 tableView.reloadData() 109 } 110 111 // スワイプでの削除を無効化して設定する 112 let swipeAction = UISwipeActionsConfiguration(actions:[deleteAction, shareAction]) 113 swipeAction.performsFirstActionWithFullSwipe = false 114 115 return swipeAction 116 } 117} 118 119class Item: NSObject,NSCoding{ 120 121 var title:String 122 123 init(title:String) { 124 self.title = title 125 } 126 127 func encode(with coder: NSCoder) { 128 coder.encode(self.title,forKey: "title") 129 } 130 131 required init?(coder: NSCoder) { 132 self.title = coder.decodeObject(forKey: "title") as! String 133 } 134 135}
疑問点,不明な点
1.segmentedcontrolにUDで保存したItemを表示するにはどうすればできるのか。
まずそれは可能か。
(今のコードだとviewDidLoadにて読み込みを行なっており、新たに追加したcellは保存されません)
2.cellの遷移はPerformSegueで行えるのか
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/07/08 14:52
2020/07/08 20:06