状況
選択すると暗くなるTableviewを使っているのですが、アクセサリーで画面移動したり、検索バーを押すと保持状態が消えてセルの色が白に戻ってしまいます…(中では押されている認識になっている)
また、検索バーを押している状態でアクセサリボタンを押すとエラーが出てしまいます…
エラーメッセージ
reason: 'Application tried to present modal view controller on itself. Presenting controller is <UISearchController: 0x7ffec9075200>.'
遷移先の画面
青くなってる文字を変更して前の画面に戻る処理をする。
コード
override func viewDidLoad() { super.viewDidLoad() //searchControllerまとめ searchController = UISearchController(searchResultsController: nil) searchController.searchResultsUpdater = (self as UISearchResultsUpdating) //位置を固定する searchController.hidesNavigationBarDuringPresentation = false searchController.searchBar.placeholder = "search" //フォーカス時に背景色を暗くするか? searchController.obscuresBackgroundDuringPresentation = false //サイズを調整 searchController.searchBar.sizeToFit() //tableViewのヘッダーにセット tableView.tableHeaderView = searchController.searchBar //Tableviewまとめ tableView.frame = tableViewContainer.bounds tableView.delegate = self tableView.dataSource = self tableView.allowsMultipleSelection = true tableViewContainer.addSubview(tableView) getData() NotificationCenter.default.addObserver(self, selector: #selector(cookingViewController.receivechange(_:)), name: Notification.Name("change"), object: nil) searchResults = recipedata.shared.nameArray.enumerated().map { $0.0 } } @objc func receivechange(_ notification: NSNotification) { let amountget = notification.userInfo!["amount"] as! String let priceget = notification.userInfo!["price"] as! String let cellget = notification.userInfo!["cellindex"] as! Int recipedata.shared.amountArray[cellget] = amountget recipedata.shared.priceArray[cellget] = priceget tableView.reloadData() } //画面をタップした時 override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) { baika.resignFirstResponder() genkaritsu.resignFirstResponder() } //文字が入力される度に呼ばれる func updateSearchResults(for searchController: UISearchController) { if searchController.searchBar.text! == ""{ searchResults = recipedata.shared.nameArray.enumerated().map { $0.0 } }else{ self.searchResults = recipedata.shared.nameArray.enumerated().filter({ // 大文字と小文字を区別せずに検索 $0.1.lowercased().contains(searchController.searchBar.text!.lowercased()) }).map({ $0.0 }) } self.view.endEditing(true) self.tableView.reloadData() } func tableView(_ tableView: UITableView, accessoryButtonTappedForRowWith indexPath: IndexPath) { searchController.dismiss(animated: true, completion: nil) celltaped = searchResults[indexPath.row] performSegue(withIdentifier: "edit", sender: nil) } func numberOfSections(in tableView: UITableView) -> Int { return 1 } func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { return searchResults.count } func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { let cell = UITableViewCell(style: .subtitle, reuseIdentifier: "Cell") cell.selectionStyle = .blue cell.textLabel?.text = recipedata.shared.nameArray[searchResults[indexPath.row]] cell.textLabel?.adjustsFontSizeToFitWidth = true cell.textLabel?.numberOfLines = 1 cell.detailTextLabel?.text = recipedata.shared.amountArray[searchResults[indexPath.row]] + recipedata.shared.taniArray[searchResults[indexPath.row]] + " " + recipedata.shared.priceArray[searchResults[indexPath.row]] + "円" cell.detailTextLabel?.adjustsFontSizeToFitWidth = true cell.detailTextLabel?.numberOfLines = 1 cell.accessoryType = .detailButton return cell } func getData(){ //省略 } func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { let cell = tableView.cellForRow(at:indexPath) print("select - (indexPath)") cell?.isSelected = true //totalに入れる self.total += Float(recipedata.shared.priceArray[searchResults[indexPath.row]]) ?? 0 genkaTotal.text = String(self.total) //totalをラベルに反映させる selectedrecipe.append(indexPath.row) if kotei == "baika" { BaikaKotei() }else{ GenkaKotei() } } override func prepare(for segue: UIStoryboardSegue, sender: Any?) { if segue.identifier == "edit" { let nextVC = segue.destination as! CellViewController nextVC.namevalue = recipedata.shared.nameArray[celltaped] nextVC.categoryvalue = recipedata.shared.categoryArray[celltaped] nextVC.unitvalue = recipedata.shared.taniArray[celltaped] nextVC.amountvalue = recipedata.shared.amountArray[celltaped] nextVC.pricevalue = recipedata.shared.priceArray[celltaped] nextVC.cellindex = celltaped } } //2回目の選択時 func tableView(_ tableView: UITableView, didDeselectRowAt indexPath: IndexPath) { print("deselect - (indexPath)") let cell = tableView.cellForRow(at:indexPath) cell?.isSelected = false self.total -= Float(recipedata.shared.priceArray[searchResults[indexPath.row]]) ?? 0 genkaTotal.text = String(self.total) if let deselect = selectedrecipe.firstIndex(of: indexPath.row){ selectedrecipe.remove(at: deselect) } if kotei == "baika" { BaikaKotei() }else{ GenkaKotei() } } @IBAction func save(_ sender: Any) { searchController.dismiss(animated: true, completion: nil) var alertTextField: UITextField? let alert = UIAlertController( title: "レシピ名", message: "名前をつけて保存", preferredStyle: UIAlertController.Style.alert) alert.addTextField( configurationHandler: {(textField: UITextField!) in alertTextField = textField }) alert.addAction( UIAlertAction( title: "Cancel", style: UIAlertAction.Style.cancel, handler: nil)) alert.addAction( UIAlertAction( title: "OK", style: UIAlertAction.Style.default) { _ in if let text = alertTextField?.text { var saver: [String] = UserDefaults.standard.array(forKey: "alert") as? [String] ?? [] saver.append(text) UserDefaults.standard.set(saver, forKey: "alert") var baikabox: [String] = UserDefaults.standard.array(forKey: "baikaB") as? [String] ?? [] baikabox.append(self.baika.text!) UserDefaults.standard.set(baikabox, forKey: "baikaB") //各々userdefaultに保管 var tap: [[Int]] = UserDefaults.standard.array(forKey: "tap") as? [[Int]] ?? [] tap.append(self.selectedrecipe) UserDefaults.standard.set(tap, forKey: "tap") } } ) self.present(alert, animated: true, completion: nil) } }
誰か助けてください(´;ω;`)
ツールのバージョン
Xcode : Version 11.2.1
Swift : Apple Swift version 5.1
追記
struct GoogleData: Decodable { let name: String let amount: String let unit: String let price: String let category: String private enum CodingKeys: String, CodingKey { case name case amount case unit case price case category } }
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/12/03 06:07
2019/12/03 06:14
2019/12/03 06:16