ラベル Storyboard の投稿を表示しています。 すべての投稿を表示
ラベル Storyboard の投稿を表示しています。 すべての投稿を表示

2014年10月5日日曜日

Xcode6ではStoryboardで指定するSegue名が変更されている

Storyboardで指定するSegue(セグエ)名

Xcode6ではSegue名が変更され、以前まで使用していたpush, modal等のSegueはDeprecated Segueとなり非推奨となってしまいました。互換性のために残されていると考えられるので、今後は新しいSegueを使用した方が良いでしょう。

新しいSegue(セグエ)名について
Segue(セグエ)名の対応表
Xcode5 Xcode6 機能概要
Push Show NavigationControllerのNavigationスタックにViewControllerを追加します。画面はアニメーションしながら次の画面(ViewController)を表示します。Navigation用の戻るボタンやエッジスワイプで元の画面に簡単に戻れます。
Model Present Modally 現在の画面(ViewController)の上に新しい画面(ViewController)を表示します。新しい画面はNaivationControllerでは管理されません。
Popover Present As Popover 主にiPadで吹き出しスタイルの表示を行います。
Replace Show Detail 主にiPadで現在表示している画面(ViewController)の差し替えを行います。iPadの設定アプリで項目の選択で右側ペインの画面さ差し替わっていくイメージです。
Accessory ActionのSegue(セグエ)について

今まであまり使ったことがなかったので、調べてみました。このAccessory Actionセグエはアクセサリアイコンが選択された時用のセグエになるようです。例えば、TableViewではセルのAccessoryを指定することが可能で、そのアクセサリが選択された場合とテーブルセル自体が選択された時を区別するためにセグエが別に定義されているようです。


AD.

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ですが、モーダルの画面を閉じる場合も同様の実装となります。

2012年6月26日火曜日

iOS Storyboardによる画面遷移の実装(Navigation Controller)

iOSアプリケーションでは比較的使うことが多いと思われるNavigation Contorollerですが、storyboardを使ってNavigationControllerの遷移を実装してみる。
今回の目標:Navigation Controllerによる画面遷移をstoryboardで作る
なぞなぞを表示して、その回答の選択肢がボタンになっている。ボタンを押すことで画面遷移し、回答が正解かを画面上に表示するだけのサンプルプログラムを作成する。
プロジェクトの作成
前回のプロジェクト(iOS Storyboardによる画面遷移の実装(Modal View))をそのまま流用します。
NavigationControllerの追加
「Single View Application」から作成した前回のプロジェクトにNavigationControllerを追加する。 NavigationControllerの追加はオブジェクトライブラリ(右下のやつ)からドラッグしても作成出来ますが、ドラッグして作成すると、なぜかTableViewがもれなく付いてくる。 xcodeでは挿入が出来るのでその機能を使います。挿入したいViewControllerを選択して、メニューのEditor - Embed in- Navigation Controller を選択するとNavigationControllerが挿入される。
メニューからEditor - Embed in- Navigation Controller を選択。
NavigationControllerが挿入される。
なぞなぞ用の新しいViewControllerの追加
なぞなぞ表示用に新しいViewControllerを追加して、Navigation Barを表示にしておく。 そして、一番初めの画面になぞなぞを画面に遷移するためのボタンを新しく作成する。 新しく作成したViewController用にカスタムクラス(RiddleViewController)を作成し、カスタムクラスとして設定しておく。
Navigation Barを表示。
新しいボタン作成。
カスタム用の新規クラス。
カスタムクラスとして設定する。
「なぞなぞ」ボタンが押されたらなぞなぞ画面に遷移させる。「なぞなぞ」ボタンをCntrollを押しながら遷移先の画面にドラッグし、セグエとして「Push」を選択する。また、分かりやすいようにタイトルも入れておく。
「Push」を選択。
=== [2014/10/05 追記] ===

Xcode6ではSegue名が変更になっています。詳しくはXcode6ではStoryboadで指定するSegue名が変更されている(https://selection9.blogspot.jp/2014/10/xcode6storyboadsegue.html)を参照下さい。

=== 追記終わり ===

タイトルの編集。
なぞなぞ画面の作成
なぞなぞを表示し、その結果を入力するボタンを3つ作成する。もちろん、正解は「しか」。
なぞなぞの回答を表示する画面を作成する。そして、追加ViewControllerのカスタムクラス(AnswerViewController) を作成し、設定する。
カスタムクラスとして設定。
回答ボタンを押した際のSegue(セグエ)を作成する。
ボタン一つ一つに対応したSegue(セグエ)を作成しても良いが、回答表示用のViewControllerは共通の画面を使用 したいので、今回はViewController間のSegue(セグエ)を作成する。(図参照) 画面の下の方にある丸っぽいのがViewControllerを表しているので、そこからControllボタンを押しながら 遷移先のViewControllerまでドラッグする。Segueのスタイルは「Push」を設定する。
回答用画面の編集
目印のためタイトルを入れて、回答結果を表示するラベルを設置。ラベルの内容は後で回答結果に伴い変更するので、 このままで良い。
アウトレット、アクションの作成
回答用の画面に設定したラベルのアウトレットを作成する。
※このアウトレットは無理に必要無いです。後で直接ラベルのテキストを変更しようとこの時は考えていたのですが 画面の初期化順の影響でうまく動かなかったので。


なぞなぞ画面に配置した回答用のボタンのアクションを作成する。各ボタンをControllボタンを押しながらこの画面のカスタムクラスであるRiddleViewController.mにドラッグしアクションを作成する。 これを3つのボタン分行う。因みに、ヘッダでなくボディファイル(拡張子mのファイル)に作成しているのはこのメソッドがプライベートなメソッドだからです。ボタンのイベントを受けられれば良いので、このメソッドを外部に公開する必要は無いことからプライベートにしている。
Segue(セグエ)にIDを付ける
なぞなぞ画面から回答結果の画面へ遷移するSegueのIdentifireを設定する。この値は後でCode上から指定することになる。
ソースコードの編集
RiddleViewController.mの内容。
#import "RiddleViewController.h"
#import "AnswerViewController.h"

@interface RiddleViewController ()
@property (nonatomic) NSString* answer;
@end

@implementation RiddleViewController

@synthesize answer = _answer;

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if (self) {
        // Custom initialization
    }
    return self;
}

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

- (void)viewDidUnload
{
    [super viewDidUnload];
    // Release any retained subviews of the main view.
}

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
    return (interfaceOrientation == UIInterfaceOrientationPortrait);
}

//なぞなぞの回答を設定する共通メソッド
- (void) riddleAnswer:(NSString*)answer {
    //回答を設定
    _answer = answer;
    //回答のViewControllerへ遷移するセグエのIdentifierを設定し、
    //コード上から遷移させる。
    [self performSegueWithIdentifier:@"AnswerSegue" sender:self];
}

//このメソッドはセグエが実行されて画面が遷移する前に呼び出されるメソッド
//オーバーライドして、処理を追加。
- (void) prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
    if ([segue.identifier isEqualToString:@"AnswerSegue"]) {
        //遷移先のViewControllerインスタンスを取得
        AnswerViewController *avc = segue.destinationViewController;
        avc.answerMessage = _answer;
    }
}

//ぞう
- (IBAction)elephant:(id)sender {
    [self riddleAnswer:@"ざんねん"];
}
//くま
- (IBAction)bear:(id)sender {
    [self riddleAnswer:@"ざんねん"];
}
//しか
- (IBAction)deer:(id)sender {
    [self riddleAnswer:@"正解!"];
}

@end
各Actionから呼び出されるメソッドではriddleAnswerというメソッドを呼び出している。引数から分かる通り 回答結果の文字列を設定している。なぞなぞの正解は「しか」なのでしかのボタンActionでは「正解!」という文字列が設定される。 riddleAnswerのメソッドでは、引数の文字列を_answerというインスタンス変数に代入している。そして、コード上から セグエの遷移実行を行う。
[self performSegueWithIdentifier:@"AnswerSegue" sender:self];
performSegueWithIdentifierの第一引数はSegueのIdentifierを指定する。 これで、ボタンが押されたら回答の画面に遷移する。

次に、回答の画面(AnswerViewController)へ回答結果を受け渡す必要がある。 Segueが実行される前に呼び出されるメソッドがあり、そのメソッドをオーバーライドすることでSegueが実行される 前に遷移先のインスタンスへデータを設定する。
- (void) prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender;
まず、Segueが自分が意図している遷移かを判定する。判定はSegueのIdentifierを使用して判定する。 本当に自分の意図したSegueだった場合、遷移先のViewControllerインスタンスを取得し、インスタンスへデータを設定する。遷移先のインスタンスは 引数で受け渡されるsegueからsegue.destinationViewController;で取得出来る。 受け取り側ViewControllerであるAnswerViewController.mでは受け取った文字列を- (void)viewDidLoad メソッド の中でラベルのTextに設定する。
#import "AnswerViewController.h"

@interface AnswerViewController ()

@end

@implementation AnswerViewController
@synthesize answer = _answer;
@synthesize answerMessage = _answerMessage;

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if (self) {
        // Custom initialization
    }
    return self;
}

- (void)viewDidLoad
{
    [super viewDidLoad];
 // Do any additional setup after loading the view.
    
    _answer.text = _answerMessage;
    
}

- (void)viewDidUnload
{
    [self setAnswer:nil];
    [super viewDidUnload];
    // Release any retained subviews of the main view.
}

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
    return (interfaceOrientation == UIInterfaceOrientationPortrait);
}

@end
以上で実装は終わり。見て分かる通りこれでもソースコードの実装はたいして行なっていない。
個人的にはコード量が云々というより、やはり画面遷移がビジュアル的に表現されているのが素晴らしいと思う。
Storyboardによる「戻る」実装についてはStoryboardでNavigationControllerの戻るを実装する(UnWindによる実装)をご参照下さい。

2012年6月22日金曜日

iOS Storyboardによる画面遷移の実装(Modal View)

iOS5になってから登場したStoryboard、今までInterface Builderを使わない派だったこともあって、手を出していなかったのですが、実はず~っと前から気になってたし使ってみたかったんですよ。 私は以下の点でStoryboardを使う理由があると思う。
  • GUI上の1画面で複数のView Controller定義を記述できる
  • 各View Controller間の遷移をSegue(セグエ)で表現可能でGUI上から編集が可能
  • アプリケーション全体の画面遷移が一望出来る
  • 今回の目標:モーダルビューを表示して、閉じてまた元の画面に戻る
    とても簡単なものから。モーダルビューを表示して閉じるだけ。ほとんど画面操作のみで出来る。
    プロジェクトの作成
    プロジェクトを新規作成。「Single View Application」から作成する。
    目印のラベルとモーダルViewに遷移するボタンも作成しておく。
    新しいView Controllerを追加
    モーダルビュー用に新しい「View Controller」をstoryboard上へドラッグして作成する。 目印のために「モーダルView」というラベルを追加。
    Segue(セグエ)の作成
    「Control」ボタンを押しながら「button 1」をドラッグし、そのまま右側のモーダルView上でリリース。 すると、図のような小さなウィンドウが表示されるので「Modal」を選択。 あと、モーダルViewに遷移したことを見た目上分かりやすくするために、モーダルViewの背景色を変更しておく。これは別に何色でも良い。
    ===== [2014/10/05 追記] =====

    Xcode6ではSegue名が変更になっています。詳しくはXcode6ではStoryboadで指定するSegue名が変更されている(http://selection9.blogspot.jp/2014/10/xcode6storyboadsegue.html)を参照下さい。

    ===== 追記終わり =====
    ここまでで、一旦実行してみる。「botton 1」を押すと、下側からモーダルViewがスライドされて来てモーダルViewが表示される。まだ戻るボタンを作成していないので、表示して終わり。
    閉じるボタンの実装
    「モーダルView」に閉じるボタンを作成。
    「閉じる」ボタンが押されたらモーダルViewを閉じる処理を記述する。 モーダルViewのViewはStoryboardで作成したので、このままだとこの画面に対応する独自のクラスが存在しない。まずはViewControllerを継承した独自クラスを作成する。
    作成したクラスをStoryboard上のモーダルViewのカスタムクラスとして設定。
    作成したModalViewController.mを開く。この際、Storyboardとソースを同時に2画面で表示する。 「閉じる」ボタンをCntrolボタンを押しながらModalViewController.mのソース上にドラッグする。 すると、Action作成用の画面がポップアップされるので、Name欄に任意のメソッド名を設定する。 このメソッドが「閉じる」ボタンが押された時のメソッドになる。
    次に作成したメソッドにモーダルViewを閉じる処理を記述。
    - (IBAction)closeModalDialog:(id)sender {
    //    [self dismissModalViewControllerAnimated:YES]; //これは間違い
        //モーダルViewを表示したViewControllerに対してdismissメッセージを送信する。
        //[self presentingViewController]で遷移前のViewControllerを取得しています。
        [[self presentingViewController] dismissModalViewControllerAnimated:YES];
    }
    
    ↑2012/7/4 修正:モーダルViewを閉じる処理間違ってました。dismissModalViewControllerAnimatedはモーダルViewを表示したViewControllerに対して送信する必要がありました。コードのコメントにも書いていますが、遷移前のViewControllerを取得してdismissメッセージを送信させることでモーダルViewを閉じる。 以上で完了。今回のモーダルViewは一番簡単な例だけど、殆どソースコードを書かなくてもこの程度なら出来てしまうのは素晴らしいのではないでしょうか。
    storyboardを使ったNavigation Controllerの実装の記事もどうぞ。
    iOS Storyboardによる画面遷移の実装(Navigation Controller)