質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

Q&A

1回答

1808閲覧

ボタン押下時にUIStackViewの削除をしたい

quwant

総合スコア5

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

0グッド

0クリップ

投稿2021/05/26 09:00

編集2021/05/27 01:16

<期待する処理>
削除ボタンを押下した時に、そのボタンが属している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

イメージ説明

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

quwant

2021/05/27 01:23

hoshi-takanoriさん ご回答いただきありがとうございます。質問内容を修正しましたので可能であればご確認ください。 removeFromSuperviewについてですが、 おそらく「削除対象のStackインスタンス.removeFromSuperview()」のような形になるかと思いますが、Stackを生成するスコープの中でインスタンス生成を行なっているため、削除ボタンを押下した時の対象Stackを指定できていません。なので、removeFromSuperviewは現在利用できない状態です。 もし、削除ボタン押下時の対象Stackインスタンスを取得することができればそれを引数にして削除可能かと思っているのですが、そのような処理または他のやり方等ありますでしょうか?
tomato879241

2021/05/27 01:30

ただ該当するChildStack内のボタンやら何やら全てでisHiddenをtrueにすればいいのでは?
quwant

2021/05/27 02:13 編集

tomato879241さん ご回答いただきありがとうございます。 removeFromSuperviewができない時はStackの表示/非表示(トルツメ)をしようと思っています。 ただなるべくその方法はやりたくなくて、その理由がtextFieldの数を可変にしたいからです。仮に10個textFieldを用意しておいたとして、もし11個目が必要になった時に対応ができないと考えているからです。 実際、textFieldが何個必要なのか決まっていないためremoveFromSuperviewでの対応がいいと考えています。 断片的な情報しか出せないので伝わりづらいと思いますが、よろしくお願いいたします。 <追記> 説明不足がありました。 削除したいtextFieldを選択できるようにしたいです。 トルツメですと最も上にあるtextFieldが削除対象になってしまいます。 希望は、仮に3つtextFieldがあり真ん中のtextFieldを消したいと思った時にそれを消せるようにしたいです。
guest

回答1

0

可能です。

他の View と違って、 UIStackView から削除するのはちょっと注意が必要です。

  • ${削除したい UIStackView}.removeFromSuperView()
  • ${親 View}.removeArrangedSubviews(${削除したい View})

の 2 つを呼んでください。

なぜ 2 つ呼ぶ必要があるかは https://ema-hiro.hatenablog.com/entry/20170304/1488618438 このあたりを参考にしてみてください。

投稿2021/06/07 13:42

DaichiHayashi

総合スコア19

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問