*

Xcode5&Objective-Cでセグエを利用して画面遷移を実現する。[後編:データのやり取り]

公開日: : 最終更新日:2014/04/28 Objective-C , ,


スポンサードリンク



[前編:モックの作成]では、セグエを利用した画面遷移を実装しました。

後編では、各画面間でデータのやり取りを行えるようにします。
[前編:モックの作成]をまずはご覧ください。

利用しているXcodeはXcode5(5.1)となります。

それにしてもデリゲートとセグエ、及び画面コンポーネントの初期化タイミング等
を考えて作成したちょっとしたiPhoneアプリ(超ちょっと・・・)の説明を行うのは難しいですね・・・
思った以上に時間がかかってしまいました。

完成後のプロジェクトの圧縮ファイルをアップしておきますので、ご利用ください。
SequeSample

本エントリの内容は以下の様になります。

  1. データのやり取りとその実現方法
  2. 実際の実装
  3. アプリ完成後のイメージ

1 データのやり取りとその実現方法

実際にやり取りするデータの確認

「初期画面」から「朝の画面」と「夜の画面」へのやり取り

「初期画面」で入力される「お名前」(実際にはラベルの右のTextField)を
「朝の画面」と「夜の画面」で表示します。
スクリーンショット 2014-04-22 15.28.29

「朝の画面」or「夜の画面」から「初期画面」へのやり取り

「朝の画面」と「夜の画面」で入力された「送る言葉」と「画面名」と「名前」を「戻る」ボタンが押された時に「初期画面」に渡して
以下の様に表示します。
スクリーンショット 2014-04-23 13.44.29

実現方法

この部分につきましては、文字だけで内容が記載されておりますので非常に分かりにくいです。
分からない場合は、サラッと目を通すぐらいの気持ちでお読みいただき、詳細は「2 実際の実装」でご理解いただければと思います。

「朝の画面」と「夜の画面」から「初期画面」に戻る時のデータ作成

「朝の画面」と「夜の画面」の画面コントローラMorningViewControllerとNightViewController
のsuperクラスをSeenViewController(新規作成)に変更します。

SeenViewControllerは
– (NSString *) getWindowData;メソッドを定義し、このメソッドを
MorningViewControllerとNightViewControllerでオーバーライドし、
「戻る」ボタンが押されてた時に「初期画面」に引き渡すデータを返却するようにします。

getWindowDataメソッドはJavaやC#の抽象メソッドのような物にしたいのですが、
その考え方はObjective-Cには存在しないので、SeenViewController.mで空実装をしています。

実際の処理はMorningViewControllerとNightViewControllerでgetWindowDataをオーバーライドして処理を実装します。

SeenViewControllerDalegateの定義

ProtocolDelegateの詳細につきましては、
「Xcodeでデリゲートを使ってみる。[前編] 」
「Xcode(Objective-C)でデリゲートを使ってみる。[後編]」
をご覧いただければ幸いです。

Objective-Cで良くやるProtocolDelegateを利用して、「朝の画面」と「夜の画面」から
「初期画面」へ戻る時の処理でデリゲートを利用します。
「朝の画面」から「初期画面」へ戻る場合を例にすると、このデリゲートの仕組みによって
「初期画面」のコントローラViewControllerのプロパティ、メソッドと
「朝の画面」のコントローラMorningViewControllerのプロパティ、メソッドを
同一のメソッド内で参照することが可能になり、データの受け渡しが行えるようになります。

「初期画面」から「朝の画面」or「夜の画面」に遷移する前にdalegateをセットします。
dalegate先はViewControllerとなります。

「同一のメソッド内で参照することが可能になり、データの受け渡しが行えるようになる」
とのイメージとしては以下の図が分かりやすいと思います。
スクリーンショット 2014-04-23 20.39.33

作成するSeenViewControllerDalegateのメソッドもSeenViewControllerを扱うように宣言します。
なぜMorningViewControllerとNightViewControllerで宣言しないかは、「2 実際の実装」で説明いたします。

SeenViewControllerDalegateには
-(void)seenViewControllerDidFinish:(SeenViewController *)controllerメソッド
のみ定義し、SeenViewController.hにこのdalegateを@propertyで定義しておき、

dalegateをセット時に「お名前」もSeenViewControllerにセットするのですが、
「朝の画面」or「夜の画面」の画面コンポーネントはまだ初期化されていませんので少し工夫が必要です。

「朝の画面」と「夜の画面」の「戻る」ボタンのタップイベントのメソッド
から[self.delegate seenViewControllerDidFinish:self]を呼び出します。

delegateのデリゲート先は「初期画面」のコントローラであるViewControllerですので、
「初期画面」のコントローラであるViewControllerのseenViewControllerDidFinishメソッドの
引数にMorningViewControllerのインスタンスまたはNightViewControllerのインスタンスが
引数として呼び出していることに等しいです。
「朝の画面」or「夜の画面」のコントローラに対してgetWindowDataメソッドを呼び出して
「初期画面」のTextViewにセットするだけでOKです。
この動きの概要は先ほどの図を見ていただくと分かりやすいと思います。

実際には、getWindowDataはSeenViewControllerで宣言しておりますので
MorningViewControllerとNightViewControllerはこの処理でも意識しなくてもOKとなります。

その様な理由からseenViewControllerDidFinishメソッドの引数はSeenViewControllerとしています。

2 実際の実装

「初期画面」から「朝の画面」と「夜の画面」へのお名前のやり取り

必要な画面コンポーネントをアウトレット接続

実装に先立って「朝の画面」と「夜の画面」の名前を表示するラベルをアウトレット接続する必要があります。
interface builderを使ったアウトレット接続の詳細については
「Xcode5で画面コンポーネントを利用するための基本」をご覧ください。

MorningViewController.hに次の画像の様に「control」ボタンを押しながら線をのばしてからマウスのボタンを離してください。
スクリーンショット 2014-04-22 18.48.13

すると次の画像の赤枠の画面が表示されます。ので「Name」にlblNameを指定し、それ以外は変更せずに「Connect」ボタンをクリックしてください。
スクリーンショット 2014-04-22 18.51.18

「夜の画面」の名前のLabelはNightViewController.hに「Name」=lblNameで接続してください。

同様に「初期画面」のお名前のTextFieldはViewController.hに「Name」=txtNameで
「初期画面」のお名前のTextViewはViewController.hに「Name」=txtviResultでアウトレット接続してください。

SeenViewControllerの作成とその関連作業

・SeenViewControllerをsuperクラス:UIViewControllerを指定して作成してください。

SeenViewController.hは以下の様になります。
delegateとtempNameValueを宣言します。
getWindowDataメソッドも定義します。

SeenViewController.mは以下の様になります。

・MorningViewControllerとNightViewControllerのsuperクラスをSeenViewControllerに変更してください。

お名前の実際の受け渡し

ViewController.mのprepareForSegue:sender:メソッドを利用します。
このメソッドはセグエで画面移動が発生する直前に呼び出されるイベントハンドラです。

このタイミングで
SeenViewControllerのdelegateにViewControllerを
tempNameValueにtxtName.textの値をセットします。
(SeenViewControllerの実インスタンスはMorningViewControllerかNightViewControllerです。)

この処理のシーケンス図は以下の様になります。
といってもシーケンス図もどきです(クラスの継承関係が表現できていないので)
スクリーンショット 2014-04-23 15.12.35

実際のViewController.mのprepareForSegue:sender:メソッドは以下の様になりました。
「朝の画面」と「夜の画面」のコントローラのsuperクラスをSeenViewControllerにしていることによる効果が出ています。
MorningViewControllerの時は、なんてコードの分岐が無くて、コードがスッキリできていることが見て取れると思います。

 

SeenViewControllerDalegateの作成

今回は「夜の画面」と「朝の画面」からデータを「初期画面」に戻すためにデリゲートを用いますので、
必要なデリゲートを作成します。
「ファイルの作成」時のファイルテンプレートで「Objective-C protocol」を選択し
名前にはSeenViewControllerDalegateを指定してください。

スクリーンショット 2014-04-23 15.55.32

スクリーンショット 2014-04-23 15.55.42

SeenViewControllerDalegateの中身は以下の様になりました。
デリゲートするメソッドはseenViewControllerDidFinishのみです。

作成したSeenViewControllerDalegateのデリゲート先はViewControllerとなりますので
ViewController.hのインターフェース定義部分を以下の様に変更します。

これによりseenViewControllerDidFinishメソッドを実装する必要が発生しますので
ViewController.mに以下のコードを追加してください

「初期画面」のTextViewに表示する値の受け渡し

「朝の画面」と「夜の画面」の「戻る」ボタンのイベントハンドラの実装となります。

MorningViewControllerとNightViewControllerで処理が異なる所はgetWindowDataメソッドだけですので
MorningViewControllerを例に説明をさせていただきます。

「戻る」ボタンのイベントハンドラでは、
superクラス(SeenViewController)のdelegateのseenViewControllerDidFinishメソッドをselfを引数に呼び出すだけです。
当然ですが、selfはMorningViewControllerです。

MorningViewControllerの「戻る」ボタンのイベントハンドラは以下の様になりました。

繰り返しになりますが、ViewController.mのprepareForSegue:senderメソッドで
delegateにはViewControllerがセットされていますので、
[super.delegate seenViewControllerDidFinish:self];は
ViewControllerのseenViewControllerDidFinishを呼び出していることとなります。

ViewController.mのseenViewControllerDidFinishは以下の様になります。
ここでSeenViewControllerでgetWindowDataが定義されていて、各継承クラスでオーバーライドされている実装が効いてます。
このタイミングでは「初期画面」の画面コンポーネントはとっくに初期化されていますので、直接設定してもOKです。

アプリ完成後のイメージ

最後に簡単ではありますが、完成後の画面イメージは以下の様になりました。
「戻る」ボタンが少し切れてます。理由は分かり次第、修正履歴として追記いたします。

「初期画面」:初期表示時

スクリーンショット 2014-04-23 20.55.19

「朝の画面」:「初期画面」で太郎と入力して、「シーン1」ボタン

スクリーンショット 2014-04-23 21.01.22

「初期画面」:「朝の画面」で”おはよう”と入力して「戻る」ボタン

スクリーンショット 2014-04-23 21.02.45


スポンサードリンク

Googleアドセンス

Googleアドセンス




関連記事

Xcodeの使い方[エディタエリアの環境設定]

「Xcodeの使い方」に引き続き「Xcodeの使い方[エディタエリアの環境設定]」となります。

記事を読む

Xcode&Objective-Cの文字列処理をユニットテスト(XCTestフレームワーク)で確認する。[NSStringの定義、分割、検索]

文字列の処理、操作は、どの言語でプログラムを作成するにしても重要で欠かせないものです。 Obj

記事を読む

Xcode5の「Auto Layout」機能の使い方[Pin制約の設定方法]

「基礎知識と制約(Align:アライメント)の設定方法」に引き続き、「Auto Layout」に必要

記事を読む

iOS(Xcode6とObjective-C)におけるマルチスレッド処理の実装方法その1[NSThreadクラスの簡単な利用例]

「iOS(Xcode6)におけるマルチスレッド処理の実装方法その1」に引き続きiOSに置けるマルチス

記事を読む

Xcode5の「Auto Layout」機能の使い方[制約の編集方法]

Xcode5の「Auto Layout」機能の使い方と Xcode5の「Auto Layout

記事を読む

Objective-C(Xcode)でイメージのアニメーション表示を行う。

「Xcode5でイメージ(画像)を表示&操作する」では画面に表示されているイメージをタップし

記事を読む

Xcode5で画面にナビゲーションバーを配置して利用する。

今回は「ナビゲーションバー」をiPhoneアプリの画面に配置して利用する方法を記載させていただきます

記事を読む

Xcode&Objective-Cの文字列処理をユニットテスト(XCTestフレームワーク)で確認する。[NSStringの比較]

前回は、NSStringの定義、分割、検索の各処理を確認しました。 二回目は、NSStringの比

記事を読む

no image

Xcode5のナビゲーションエリア[問題ナビゲータ]の使い方

Xcode5のナビゲーションエリアの使い方では、アプリ開発に最も不可欠は、プロジェクトとシンボルナビ

記事を読む

Xcode5の「Auto Layout 」機能の使い方[基礎知識と制約(Align)の設定方法]

Xcode4から導入された「Auto Layout」ですが、使いこなせるようになるのは骨が折れます。

記事を読む

Comment

  1. […] Xcode5&Objective-Cでセグエを利用して画面遷移を実現する。[後編 … […]

Message

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

動画で英語を学習できるiOSの無料アプリCapTubeをリリースいたしました。

個人では初となるiOSアプリをリリースいたしました。 何度もリジ

no image
Ruby on rails4系でBootstrapを利用するためのtips

MacでRuby on rails4系のBootstrapを利用しよう

no image
Java、Eclipse、JUnit関連のエントリーの移行のお知らせ

Java、Eclipse、JUnit関連のエントリーは http:/

iOS8開発者向けお勧め本紹介[詳細! Swift iPhoneアプリ開発 入門ノート Swift 1.1+Xcode 6.1+iOS 8.1対応]

iOS7開発者向けお勧め本紹介を以前に紹介させていただきまいたが、今回

Swift入門(Xcode6のXCTestフレームワークで学ぶ) 第二回「関数(メソッド)とクロージャーの利用方法」

前回はSwiftの概要をザックリと説明させていただきました。 今

→もっと見る

Optimization WordPress Plugins & Solutions by W3 EDGE
PAGE TOP ↑