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

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

新規登録して質問してみよう
ただいま回答率
85.50%
Objective-C

Objective-Cはオブジェクト指向型のプログラミング言語のひとつです。C言語をベースにSmalltalkが取り入れられています。

iOS

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

Xcode

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

Swift

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

iPhone

iPhoneとは、アップル社が開発・販売しているスマートフォンです。 同社のデジタルオーディオプレーヤーiPodの機能、電話機能、インターネットやメールなどのWeb通信機能の3つをドッキングした機器です。

Q&A

解決済

1回答

2697閲覧

Xcodeで"whose view is not in the window hierarchy!"が解決できません

ababab

総合スコア47

Objective-C

Objective-Cはオブジェクト指向型のプログラミング言語のひとつです。C言語をベースにSmalltalkが取り入れられています。

iOS

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

Xcode

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

Swift

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

iPhone

iPhoneとは、アップル社が開発・販売しているスマートフォンです。 同社のデジタルオーディオプレーヤーiPodの機能、電話機能、インターネットやメールなどのWeb通信機能の3つをドッキングした機器です。

0グッド

0クリップ

投稿2017/01/25 08:34

編集2017/01/26 03:59

モーダルでViewControllerを遷移中、"Attempt to present on ..whose view is not in the window hierarchy!"のエラーが出て新しいViewを表示することができません。

今の実装手順はこちらです。

1.aViewControllerからbViewControllerにモーダルで遷移 2.AppDelegateのBecomeActiveを用い、bViewControllerでアクティブ状態に戻った後一番上の画面(この場合bViewController)に新しいViewを貼りつける (Viewを貼り付けるメソッドは"addView"で、名前も中身も同じものを各ViewControllerに書いています)

通知の実行対象をselfとするとselfがaViewControllerになってしまい、先ほどのエラーが出てしまいます。
同様にaViewControllerからcViewControllerに移った場合も、selfがaViewControllerになってしまいViewを貼り付ける事ができません。
(aViewControllerにいる時だけはアクティブ状態になると正常にViewを貼り付ける事ができます。)

その時一番上に貼ってあるViewControllerにViewを貼り付けたいのですが、どうしたら良いのでしょうか?

よろしくお願い致します。

AppDelegate.m

objective

1- (void)applicationDidBecomeActive:(UIApplication *)application 2{ 3 // 通知を作成 4 NSNotification *n = [NSNotification notificationWithName:@"Tuchi" object:self]; 5 6} 7

aViewController.m(bViewcontroller、cViewControllerも同様の内容です)

objective

1- (void)viewDidLoad{ 2. 3. 4. 5//アクティブ状態になったらaddViewを実行 6NSNotificationCenter *nc = [NSNotificationCenter defaultCenter]; 7 [nc addObserver:self selector:@selector(addView) name:@"Tuchi" object:self]; 8 9} 10 11-(void)moveToB{ 12 bViewController *secondViewController = [[bViewController alloc] initWithNibName: nil bundle: nil]; 13 [self presentViewController:secondViewController animated:YES completion:nil]; 14} 15 16//Viewを貼り付ける 17- (void)addView{ 18 puv = [[UIView alloc]init]; 19 puv.frame = CGRectMake(0, 0, self.view.bounds.size.width, self.view.bounds.size.height); 20 puv.backgroundColor = [UIColor redColor]; 21 [self.view addSubview:puv]; 22}

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

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

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

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

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

guest

回答1

0

ベストアンサー

aViewController, bViewController, cViewControllerの全てでaddObserverメソッドを使って、オブザーバーにしているという状態ですね?

その場合、AppDelegateがNotificationを投げると、アクティブかどうかに関わらず、addViewメソッドが呼ばれます。aViewControllerからbViewControllerをモーダル表示しているときは、aViewControllerとbViewControllerが両方とも通知を受け取ります。

そのため、画面に表示されていないaViewControllerのaddViewの中で実行しているaddSubviewがエラーを起こします。

実際に動作を確認していないので、失敗する可能性もありますが、次のいずれかのコードで回避できると思います。

(A) 方法1: 表示されているときのみ通知を受け取る方法
viewDidLoadaddObserverの呼び出しを削除し、viewDidAppearviewWillDisappearで登録と解除を行う。

swift

1- (void)viewDidAppear:(BOOL)animated { 2 [super viewDidAppear:animated]; 3 4 //アクティブ状態になったらaddViewを実行 5 NSNotificationCenter *nc = [NSNotificationCenter defaultCenter]; 6 [nc addObserver:self selector:@selector(addView) name:@"Tuchi" object:self]; 7} 8 9- (void)viewWillDisappear:(BOOL)animated { 10 [super viewWillDisappear:animated]; 11 12 NSNotificationCenter *nc = [NSNotificationCenter defaultCenter]; 13 [nc removeObserver:self name:@"Tuchi" object:nil]; 14}

(B) 方法2: ウインドウの階層内にいるかをチェックする方法

swift

1- (void)addView{ 2 if (self.view.window) { 3 puv = [[UIView alloc]init]; 4 puv.frame = CGRectMake(0, 0, self.view.bounds.size.width, self.view.bounds.size.height); 5 puv.backgroundColor = [UIColor redColor]; 6 [self.view addSubview:puv]; 7 } 8}

投稿2017/02/12 23:56

studiork

総合スコア110

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問