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

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

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

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

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

Q&A

解決済

1回答

16771閲覧

[Swift]subviewの削除方法

RioNishino

総合スコア36

iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

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

0グッド

0クリップ

投稿2015/05/07 03:54

Swiftのsubviewの削除方法について質問です。

調べてみると、下記のような方法でsubviewを削除できると書いてあります。

lang

1 2let viewController = ViewController() 3 4for subview in viewController.view.subviews { 5 subview.removeFromSuperview() 6} 7

しかし、私が試してみたところ削除されません。
これはViewControllerだからでしょうか?

ViewControllerのsubviewを削除する方法を教えてください。

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

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

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

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

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

guest

回答1

0

ベストアンサー

removeFromSuperview 以外にsubviewを削除する方法はありません。
Viewの階層ですが、本Controllerがカレントとして、viewControllerのviewが子でsubviewは孫の階層になっているのを前提で間違いないでしょうか?
心当たりはそれくらいです。

投稿2015/05/07 05:03

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

RioNishino

2015/05/07 06:07

回答ありがとうございます。 removeFromSuperview以外に方法はないんですね。 階層についてはまだ勉強不足で詳しくありませんが、ViewControllerの子要素にScrollViewがあり、その中にCollectionViewがあるという作りになっています。データの更新はCollectionViewでして、ScrollViewに変更を与えたいです。 やりたいことは、ViewControllerのsubview(scrollView)をデータ更新後に変更したいのですが、方法が思い浮かずに一度削除すればいいのではないか、と考えて上記のような質問をしました。 もし、削除せずに変更できる方法があれば教えてもらえたら光栄です。
退会済みユーザー

退会済みユーザー

2015/05/07 06:39

ViewControllerの子要素にScrollViewがあるとの事ですが、ViewControllerの親viewを使っていないのであれば 下記のようにViewControllerの親viewをremoveすれば良いかと思います。 for subview in self.view.subviews { subview.removeFromSuperview() } また、カレントのController内にViewControllerを定義する必要があるのでしょうか? 私ならばカレントのController内にScrollViewとCollectionViewを定義します。 もしカレントのController内のViewControllerがsubviewではなく画面遷移ならば 質問している状況がそもそも間違っています。 ご検討ください。
RioNishino

2015/05/07 07:01

返信ありがとうございます。 説明不足というか、私の知識が足りないために質問がおかしくなってしまい申し訳ありません。正直なところ親子関係などは詳しくなく(まだまだ勉強不足で)、説明が曖昧になってしまっていました。 ①ViewController.swift ②ScrollViewController.swift ③CollectionViewController.swift ④SettingViewController.swift 現在上記の4つのファイルがあり、①ViewControllerに②ScrollViewをaddSubviewで表示しています。そして②ScrollViewに複数のテーブルを表示するために③CollectionViewをaddSubViewで追加しています。ここまではSmartNewsのようなUIを想像していただけると分かり易いかと思います。 そしてここからが質問になるのですが、④SettingViewControllerで設定を変更したときに、ScrollViewの表示を変更したいと考えており、その方法が質問内容ということです。分かりづらくて申し訳ありませんでした。 例えば、SmartNewsのように設定でチャンネルを非表示にしたり、並べ替えたりしたときにリアルタイムでViewに反映されるようにしたいです。 何か良い方法があれば、ご教示ください。
退会済みユーザー

退会済みユーザー

2015/05/07 08:36

私の場合ですが、Controllerをまたがってリアルタイムに制御する場合は AppDelegateにControllerのハンドルをプロパティとして定義しておき、 細かいviewの定義はそれぞれのControllerで処理しています。 こうすることによって、SettingViewControllerからScrollViewControllerを制御する時は UIApplication.sharedApplication().delegateからアクセスできます。 Objective-Cからブリッジを通してswiftのdelegateは見れませんので そこだけ注意してください。
RioNishino

2015/05/07 08:47

AppDelegateを使うということは理解できたのですが、「Controllerのハンドルをプロパティとして定義」して「Cviewの定義をそれぞれのControllerで処理」というのが、いまいち理解できません。初心者なので、もう少し噛み砕いていただけると有難いです。なんとなくは分かってきているので、あともう少し、具体的なコードがあると助かります。 初心者なので、説明するのも一苦労だと思います。質問も曖昧だったり、意味不明な箇所もあるかと思います。その件については本当に申し訳ありません。 もし面倒であれば、お答えは大丈夫です。 ここまででも大変勉強になりました。感謝いたします。 AppDelegateを使うんですね、やってみます! 何度もお答えいただき、有難うございました。
退会済みユーザー

退会済みユーザー

2015/05/07 09:44

授人以魚不如授人以漁 という諺にあるようにコピペで済ますような回答は私はしませんが こんなに謝られたら大サービスせざるを得ません。 ①swiftはクラスメンバとして定義するだけでプロパティとなるのでAppDelegate.swiftでプロパティを定義するだけで UIApplication.sharedApplication().delegateからアクセス可能 class AppDelegate: UIResponder, UIApplicationDelegate { var window: UIWindow? /** * ここで定義すると * UIApplication.sharedApplication().delegateからアクセス可能 */ let SettingView = SettingViewController() let ScrollView = ScrollViewController() let CollectionView = CollectionViewController() func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool { //---------------------------------------------------------- // 各画面はこのRootViewControllerが基点として制御する。 //---------------------------------------------------------- self.window!.rootViewController = ViewController() return true } //以下略 } ②それぞれのViewControllerは現状のコードからの変更の必要は無し。 ③アクセスの仕方(例) var appDelegate : AppDelegate! appDelegate = UIApplication.sharedApplication().delegate as AppDelegate appDelegate.ScrollView.view.removeFromSuperview()
RioNishino

2015/05/07 10:01

お返事、本当に有難うございます。 AppDelegateはそういう風な使い方もあるんですね!各Controllerをここで定義しておくことで、他のControllerからアクセスできるようにすると。なるほど。 大変勉強になりました。 今回教えてくださったことで、他に悩んでいた色々なことまで解決できそうです。 何度も質問に答えていただき、その上具体例まであげていただき、心より感謝致します。 私が理解できるまでお付合いくださって申し訳ありませんでした。 AppDelegateについてもっと勉強していきたいと思います。 誠に有難うございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.51%

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

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

質問する

関連した質問