<期待する処理>
削除ボタンを押下した時に、そのボタンが属しているUIStackViewを親のUIStackViewから削除したいです。
現在の画面構成は添付画像の通りです。
やりたいことは、一番上のChildStack内にある「×」ボタンを押下した時にParentStackから一番上のChildStackを削除したいです。その様な処理は可能でしょうか。
<追記>
説明が足りないと思いましたので追記いたします。
ParentStackの下にaddBtnが存在します。それは新しいChildStackを既存のChildStackの下に出現させるものです。
pushDeleteBtnメソッドの中にどの様な処理を書けばいいのか分からないため質問させていただきました。
Swift
1@objc func pushAddStackBtn(){ 2 let newStackRow = UIStackView() // <- 画像のChildStackに相当 3 let newKeyField = UITextField() // <- ChildStackの子要素(左)に相当 4 let newValueField = UITextField() // <- ChildStackの子要素(中)に相当 5 let newDeleteBtn = UIButton() // <- ChildStackの子要素(右)に相当 6 7 newStackRow.translatesAutoresizingMaskIntoConstraints = false 8 headerStackColumn.addArrangedSubview(newStackRow) 9 10 newKeyField.translatesAutoresizingMaskIntoConstraints = false 11 newStackRow.addArrangedSubview(newKeyField) 12 13 newValueField.translatesAutoresizingMaskIntoConstraints = false 14 newStackRow.addArrangedSubview(newValueField) 15 16 newDeleteBtn.translatesAutoresizingMaskIntoConstraints = false 17 newStackRow.addArrangedSubview(newDeleteBtn) 18 19 // 設定 20 newStackRow.axis = .horizontal 21 newStackRow.distribution = .fill 22 23 newKeyField.borderStyle = .line 24 newKeyField.keyboardType = .emailAddress 25 newKeyField.placeholder = "Header Name" 26 27 newValueField.borderStyle = .line 28 newValueField.keyboardType = .emailAddress 29 newValueField.placeholder = "Header Value" 30 31 newDeleteBtn.setTitle("×", for: .normal) 32 newDeleteBtn.layer.borderColor = UIColor.black.cgColor 33 newDeleteBtn.setTitleColor(.black, for: .normal) 34 newDeleteBtn.layer.borderWidth = 0.5 35 newDeleteBtn.layer.cornerRadius = 0 36 newDeleteBtn.addTarget(self, action: #selector(pushDeleteHeaderBtn(_:)), for: .touchUpInside) 37 38 // レイアウト 39 newStackRow.widthAnchor.constraint(equalTo: headerStackColumn.widthAnchor).isActive = true 40 newStackRow.leftAnchor.constraint(equalTo: headerStackColumn.leftAnchor).isActive = true 41 42 newKeyField.widthAnchor.constraint(equalTo: newStackRow.widthAnchor, multiplier: 0.3).isActive = true 43 newKeyField.leftAnchor.constraint(equalTo: newStackRow.leftAnchor).isActive = true 44 45 newValueField.rightAnchor.constraint(equalTo: newStackRow.rightAnchor).isActive = true 46 47 newDeleteBtn.widthAnchor.constraint(equalTo: newStackRow.widthAnchor, multiplier: 0.08).isActive = true 48 newDeleteBtn.leftAnchor.constraint(equalTo: newValueField.rightAnchor).isActive = true 49} 50 51 52 53@objc func pushDeleteBtn(_ sender: UIButton){ 54 // I want to delete stack 55} 56 57
削除したい ChildStack を removeFromSuperview するのが良さそうですね。
https://stackoverflow.com/questions/37525706/uistackview-is-it-really-necessary-to-call-both-removefromsuperview-and-remove
hoshi-takanoriさん
ご回答いただきありがとうございます。質問内容を修正しましたので可能であればご確認ください。
removeFromSuperviewについてですが、
おそらく「削除対象のStackインスタンス.removeFromSuperview()」のような形になるかと思いますが、Stackを生成するスコープの中でインスタンス生成を行なっているため、削除ボタンを押下した時の対象Stackを指定できていません。なので、removeFromSuperviewは現在利用できない状態です。
もし、削除ボタン押下時の対象Stackインスタンスを取得することができればそれを引数にして削除可能かと思っているのですが、そのような処理または他のやり方等ありますでしょうか?
ただ該当するChildStack内のボタンやら何やら全てでisHiddenをtrueにすればいいのでは?
tomato879241さん
ご回答いただきありがとうございます。
removeFromSuperviewができない時はStackの表示/非表示(トルツメ)をしようと思っています。
ただなるべくその方法はやりたくなくて、その理由がtextFieldの数を可変にしたいからです。仮に10個textFieldを用意しておいたとして、もし11個目が必要になった時に対応ができないと考えているからです。
実際、textFieldが何個必要なのか決まっていないためremoveFromSuperviewでの対応がいいと考えています。
断片的な情報しか出せないので伝わりづらいと思いますが、よろしくお願いいたします。
<追記>
説明不足がありました。
削除したいtextFieldを選択できるようにしたいです。
トルツメですと最も上にあるtextFieldが削除対象になってしまいます。
希望は、仮に3つtextFieldがあり真ん中のtextFieldを消したいと思った時にそれを消せるようにしたいです。