iOSでのカスタムダイアログの表示


ボタンが押されるとカスタムダイアログを表示するといったプログラムを組んでいるのですが、  
ルートの`ViewController`に`Main.Storyboard`にあるダイアログ用の`ViewController`を表示させるにはどうすればよろしいでしょうか？色々と調べていても実装例が少なく、下記のサイトを参考にしているのですがうまくいきません。（特に`objc_setAssociatedObject`というところで躓いてしまってます。。。）  
<https://codeiq.jp/magazine/2014/05/9493/>

どなたかカスタムダイアログの表示のさせ方が分かる方がいればご教授いただきたいです。  
すみませんが、よろしくお願いします。




参考ページでは`UIWindow`を使用しているようなので、  
おそらくやりたい事とは異なると思いますが、参考程度になれば幸いです。  
※すみません、参考先はあまり読んでいません。

単純に`Storyboard`上の`ViewController`を表示させるだけなら下記のようなコードで可能です。

[code]

    - (IBAction)touchUp:(UIButton *)sender
    {
        UIStoryboard* sb = [UIStoryboard storyboardWithName:@"Main" bundle:nil];
        CustomDialogViewController* vc = [sb instantiateViewControllerWithIdentifier:NSStringFromClass([CustomDialogViewController class])];
        [self presentViewController:vc animated:YES completion:nil];
    }
    
[/code]

ただ、これだと背景が真っ黒になってしまいますので、  
別案として`UIViewController`ではなく`UIView`を使用する方法もあります。

[code]

    - (IBAction)touchUpAdd:(UIButton *)sender
    {
        CustomDialogView* view = [CustomDialogView loadFromNib];
        view.delegate = self;
        view.frame = self.view.frame;
        view.alpha = 0.0f;
        [self.view addSubview:view];
        [UIView animateWithDuration:0.3f
                         animations:^{
                             view.alpha = 1.0f;
                         }
                         completion:nil];
    }
    
[/code]

こちらの方法だと背景に呼び出し元の`ViewController`を残すことが可能ですが、  
`Storyboard`ではなく`xib`を用意する必要があります（`xib`を作るのが嫌であれば全部コードで書くことも可能です）。

・UIViewControllerの場合  
![UIViewController](https://i.stack.imgur.com/jLWG6.png)

・UIViewの場合  
![UIView](https://i.stack.imgur.com/MpiO1.png)

----- 追記 -----  
`loadFromNib`は下記のような実装です。  
`xib`から読み込む場合のお決まりのような感じ（細部が若干異なる場合はあります）なので、  
`UIView`のカテゴリで用意しておくと、いちいち書かなくて良いので楽です。

[code]

    +(id)loadFromNib
    {
        return [[[NSBundle mainBundle] loadNibNamed:NSStringFromClass([self class])
                                              owner:nil
                                            options:nil]
                firstObject];
    }
    
[/code]

`view.delegate`はとりあえず消してしまっても動きに問題はありません。  
Objective-CのDelegateに関しては下記の質問が参考になると思います。  
[Objective-C の Delegateとは？](https://ja.stackoverflow.com/questions/4930)

`xib`の作成方法はご認識の通りで問題ありません。  
作成後に`xib`のアイデンティティインスペクタでCustom Classを紐付けるのを忘れないように気をつけて下さい。

念のための補足事項として、ダイアログ（CustomView）を閉じる際は、  
`removeFromSuperview`を使用します。  
※見えなくするだけなら`alpha`や`hidden`でも大丈夫だと思います。




参考ページでは`UIWindow`を使用しているようなので、  
おそらくやりたい事とは異なると思いますが、参考程度になれば幸いです。  
※すみません、参考先はあまり読んでいません。

単純に`Storyboard`上の`ViewController`を表示させるだけなら下記のようなコードで可能です。

[code]

    - (IBAction)touchUp:(UIButton *)sender
    {
        UIStoryboard* sb = [UIStoryboard storyboardWithName:@"Main" bundle:nil];
        CustomDialogViewController* vc = [sb instantiateViewControllerWithIdentifier:NSStringFromClass([CustomDialogViewController class])];
        [self presentViewController:vc animated:YES completion:nil];
    }
    
[/code]

ただ、これだと背景が真っ黒になってしまいますので、  
別案として`UIViewController`ではなく`UIView`を使用する方法もあります。

[code]

    - (IBAction)touchUpAdd:(UIButton *)sender
    {
        CustomDialogView* view = [CustomDialogView loadFromNib];
        view.delegate = self;
        view.frame = self.view.frame;
        view.alpha = 0.0f;
        [self.view addSubview:view];
        [UIView animateWithDuration:0.3f
                         animations:^{
                             view.alpha = 1.0f;
                         }
                         completion:nil];
    }
    
[/code]

こちらの方法だと背景に呼び出し元の`ViewController`を残すことが可能ですが、  
`Storyboard`ではなく`xib`を用意する必要があります（`xib`を作るのが嫌であれば全部コードで書くことも可能です）。

・UIViewControllerの場合  
![UIViewController](https://i.stack.imgur.com/jLWG6.png)

・UIViewの場合  
![UIView](https://i.stack.imgur.com/MpiO1.png)

----- 追記 -----  
`loadFromNib`は下記のような実装です。  
`xib`から読み込む場合のお決まりのような感じ（細部が若干異なる場合はあります）なので、  
`UIView`のカテゴリで用意しておくと、いちいち書かなくて良いので楽です。

[code]

    +(id)loadFromNib
    {
        return [[[NSBundle mainBundle] loadNibNamed:NSStringFromClass([self class])
                                              owner:nil
                                            options:nil]
                firstObject];
    }
    
[/code]

`view.delegate`はとりあえず消してしまっても動きに問題はありません。  
Objective-CのDelegateに関しては下記の質問が参考になると思います。  
[Objective-C の Delegateとは？](https://ja.stackoverflow.com/questions/4930)

`xib`の作成方法はご認識の通りで問題ありません。  
作成後に`xib`のアイデンティティインスペクタでCustom Classを紐付けるのを忘れないように気をつけて下さい。

念のための補足事項として、ダイアログ（CustomView）を閉じる際は、  
`removeFromSuperview`を使用します。  
※見えなくするだけなら`alpha`や`hidden`でも大丈夫だと思います。

