2013年7月15日月曜日

StoryboardでNavigationControllerの戻るを実装する(UnWindによる実装)

iOS5まではStoryboardを利用して画面遷移をある特定の状態へ戻すことができませんでした。iOS6からはこの弱点が克服され、 Storyboardにて戻るが実装可能になっています。 具体的には、モーダルViewやNavigationControllerのpushにて遷移させた画面を戻す事が出来ます。
今回の目標:NavigationControllerにて画面を遷移(push)し元の画面に戻る実装をUnWindにて実装する。
NavigationControllerを使用し、ViewController間の移動(push)や戻る(pop)実装をStoryboardにて実装する。 コードによる実装ではたかだかpopToViewController:animated:メソッドを呼び出すだけで、無理にStoryboard にて実装する必要性を感じない方もおられるかもしれませんが、実装の一貫性としては「戻る」実装をStoryboard にて実装出来ないしたいところではないでしょうか。
プロジェクトの作成
「Single View Application」にてプロジェクトを作成します。
NavigationControllerを作成して2枚のViewControllerを生成
デフォルトのViewControllerにNavigationControllerを追加して、新たにViewControllerを追加します。
プロジェクト作成直後。
「Editor」→「Embed In → NavigationControllerを設定します。
設定直後はこんな感じ。
view1からview2への画面遷移と戻るボタンの配置
Storyboardにて画面遷移を実装します。
ViewControllerを遷移させる「次へ」ボタンを配置。
次への遷移を作成。
「push」を選択。
segueが作成される。
「戻る」実装の事前準備
Storyboardにて「戻る」の実装を行うには、予め準備をしておく必要があります。 この準備は戻る側のViewControllerにて実装を行います。 View1からView2へ遷移してView2からView1へ戻るにはView1のViewControllerに事前準備を実施する必要があります。 この準備とはある特定のメソッドを事前に実装しておく必要があります。以下がそのメソッドです。戻り値と引数の型さえ一致(下記赤字)していればメソッド名自体は自由に付与することができます。
- (IBAction)popViewController1:(UIStoryboardSegue*)segue;
以下、実装例です。
#import "ViewController.h"

@interface ViewController ()

//公開する必要の無いメソッドなので、.mファイルにてメソッド定義を記載。
- (IBAction)popViewController1:(UIStoryboardSegue*)segue;

@end

@implementation ViewController

- (void)viewDidLoad
{
    [super viewDidLoad];
 // Do any additional setup after loading the view, typically from a nib.
}

- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

//戻る用のメソッド実装
- (IBAction)popViewController1:(UIStoryboardSegue *)segue {
    //遷移後に実行する内容を書く。
    //何もする必要がない場合は、空でもかまわない。
    
}

@end
Segueにて戻るを設定
「戻る」ボタンから「Exit」に接続しNavigationControllerの戻るを指定します。「Exit」に接続すると 事前準備にて作成したメソッドがポップアップし選択出来るようになりますので、選択することで Storyboard上での設定は完了です。
「戻る」ボタンの配置と分かりやすいように、タイトルの付与。
controlを押しながら「Exit」へ接続する。
実装したメソッドを選択する。
以上で実装は完了となります。事前に準備が必要ですが、Storyboardにて戻る実装が可能になっています。今回の例はNavigationControllerですが、モーダルの画面を閉じる場合も同様の実装となります。

0 件のコメント :

コメントを投稿