LoginSignup
19
17

More than 5 years have passed since last update.

表示させるViewがすでにaddSubViewされているか調べる方法

Last updated at Posted at 2016-01-10

はじめに

自作アプリの改修をしていて,広告のViewのコードのところで
ん?と思ったので Debug View Hierarchy で見てみたところ
やっぱり二重に表示されていた。そのときの修正について備忘録。

画面上だとわからないけど,見事に 2 つ表示されている・・・
00.png

Debug View Hierarchy に関してはこちらをご覧ください。
[Xcode]なぜ表示されない・・・ビルドしたアプリのViewの重なりをXcodeで確認する方法 - Qiita

原因と対策

原因

viewWillAppear と viewDidLoad で 広告の view を作成し,
表示するメソッドがそれぞれ呼ばれていた。つまり,2 つ分表示される。

対策

メソッドは両方から呼ばれてほしいので,どちらかでメソッドを呼ばない選択肢はない。よってすでに 広告 View が下地(addSubView される View) に addSubView されているかを判断して,されていれば何もしないようにした。

Objective-C
// すでに表示されてない
if (![addSubViewするView isDescendantOfView:addSubViewされるView]) {
    // 広告View生成
} else {
    //Nope
}

Swift もおそらく同じ。

実際のコード(nend)

広告表示関数
# pragma mark - View Ads method

// 広告表示関数
- (void)viewAds {

    // (2) NADView の作成
    if (![self.nadView isDescendantOfView:self.view]) {
        if ([Util isIPADPRO]) {
            self.nadView = [[NADView alloc] initWithFrame:CGRectMake(523, 0, 320, 50)];
        } else {
            self.nadView = [[NADView alloc] initWithFrame:CGRectMake(352, 0, 320, 50)];
        }
        // (3) ログ出力の指定
        [self.nadView setIsOutputLog:YES];
        // (4) set apiKey, spotId.(省略)
        [self.nadView setNendID:@"hoge" spotID:@"hoge"];
        [self.nadView setDelegate:self]; //(5)
        [self.nadView load]; //(6)
        [self.view addSubview:self.nadView];
    } else {
        NSLog(@"何もしない何もしない");
    }
}

【追記】
コメントでご指摘いただいた View の nil チェックの方がスマートな気がします。

実行してみる。これでよし。
01.png

Nend は手順通りにやれば比較的早く導入できる。ただ,日本語環境だといいけど英語環境だと表示する広告はないとエラー吐くのでため息になる。

iAd は導入自体は容易だけど表示されないときの処理書いたり色々面倒。

おわりに

表示させる View がすでに addSubView されているか調べる方法について実際の例を交えて書いた。Storyboard の VC に広告用の UIView を貼った方が早い気もする。このアプリ 1 年くらい前の私がコード書いてるんだけどしっかりしてくださいよって言いながらいい感じにツッコミながら作業できている。少しは成長したのだと思いたい。
ご覧いただき,ありがとうございました。

19
17
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
19
17