[4]:View間での移動について

今回は、あるviewから他のviewへ移動させる方法を実装します。UINavigationController を利用し、以前の記事で制作済のコードを利用します。
以前の記事(とても簡単です。)をまだ読まれてない方は、そちらを読んでから、この記事をご覧ください。

今回学ぶこと:

  • 新規ビューの追加
  • ビューコントローラを追加する
  • ビューを移動するための設定
  • ビューとコードを接続
  • 戻るボタンを設置

まず、以前につくったHelloWorldアプリをXCodeで開きます。

[cell.textLabel setText:@”HelloWorld”];

となっている行を以下に編集します。

[cell.textLabel setText:@”NextView”];


新規ビューの追加

移動後に表示されるビューを作成します。RootViewController.xibをクリックし、Interface Builder を起動します。File > New をクリックし、左ペインの中からiOS > viewを選び、新規viewを作成します。

5-1

空のビューが作成されますので、そのviewの中に新しくlabelを配置します。表示されるテキストは「View2」と設定します。(表示されるテキストはお好きな文字列でかまいません。)

新しく作成したView2を保存します。保存先は、「HelloWorld」アプリを選び、その後に表示される確認ウインドウの中にある、HelloWorldをチェックして「add」ボタンをクリックします。

作成されたView2をXCode上でResourcesフォルダに移動しておきます。

ビューコントローラを追加する

新しいviewに接続するために、ビューコントローラを作成する必要があります。XCode上から ファイル > 新規ファイル をクリックし、左ペインのiOS > Cocoa Touch Classes から UIViewController subclass を選択し、「次へ」をクリックします。

5-2

View2ViewController という名前にして、「同時にView2ViewController.h も作成」をチェックし、「完了」ボタンを押します。

出来上がったView2ViewController.h と View2ViewController.m の二つをXCode上のClassesフォルダに移動します。

ビューを移動するための設定

RootViewController.h を開き、コードを以下のように編集します。

#import <UIKit/UIKit.h>

#import “View2ViewController.h”

@interface RootViewController : UITableViewController {

View2ViewController *view2ViewController;

}

@property(nonatomic,retain) View2ViewController *view2ViewController;

@end

#import “View2ViewController.h” によって、先ほど作成したViewControllerのヘッダーファイルを読み込み、これにより、View2ViewController型の新しいインスタンスを作成することが可能になります。

そして、view2ViewController というView2ViewController 型の変数を宣言しています。頭文字の大文字(V)と小文字(v)に注意してください。

view2ViewControllerは、View2ViewController のオブジェクトを参照する際に使う変数名です。

次に、RootViewController.m を開き、以下のコードを追加します。
@implementation RootViewController という一行の下に追加してください。

@synthesize view2ViewController;

次に、didSelectRowAtIndexPath というメソッドを探し、以下のように編集します。
このメソッドは、表のセルがタップされるたびに(自動的に)呼び出されます。
これは、indexPath を取得することに注意してください。これは、後で、NSArrayを使ってUITableViewを作成する方法を示す時に役に立ちますが、今は無視しておきましょう。

– (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {

if(self.view2ViewController == nil){

View2ViewController *view2 = [[View2ViewController alloc] initWithNibName:@”View2″ bundle:[NSBundle mainBundle]];

self.view2ViewController = view2;

[view2 release];

}

// …

// Pass the selected object to the new view controller.

[self.navigationController pushViewController:self.view2ViewController animated:YES];

}

以下、コードの説明です。

まず、self.view2ViewController がnull かどうかチェックします。

これは、テーブルのセルが最初にクリックされた時に実行されます。

この後、ViewControllerは、パフォーマンスを最適化するために、メモリに格納されます。

次に、View2ViewControllerの新しいインスタンスを作成し、view2ViewControllerに設定します。(大文字と小文字の違いに注意してください。)

viewControllerを設定したあと、メモリ解放(リリース)します。

Objective-Cはガベージコレクションを備えていないので、使われなくなったオブジェクトは明示的に自分でメモリを解放する必要があります。

最後の一行は、実際に、新しく作ったviewへ遷移させるものです。

navigationController のオブジェクトは、viewControllers を含んでいます。

最後のanimated:YES は、コンパイラに遷移の際にアニメーションが必要ということを伝えています。

ビューとコードを接続

このコードを実行する前に、コードと先ほど作ったviewを接続する必要があります。

View2.xib をダブルクリックして、Interface Builderを起動します。

View2ViewControllerクラスのオブジェクトとviewを関連づける必要がありますので、File’s Owner オブジェクトを選択し、Attributesインスペクタパネルの一番右の「identity」タブをクリックします。Class Identity > Class のドロップダウンからView2ViewController を選択します。

5-4

そして、viewウインドウ内の任意の場所をクリックし、Attributesインスペクタ内のConnections(左から2番目のタブ)をクリックします。New Referencing Outlet の右側の○をFile’s Owner までドラッグ&ドロップします。ドロップするとviewという選択肢がポップアップされるので、それを選択します。

5-5

この状態で一度、ビルドして実行してみてください。

「Next View」というセルをクリックすると、画面が遷移して、view2が表示されます。しかし、この状態では、NavigationControllerの上部に戻るボタンがありません。実際には戻るボタンはアップルから提供されていますが、それを利用するには、メインビューにタイトルを指定する必要があります。

戻るボタンを設置

iPhoneシミュレータを閉じて、RootViewController.m を開いてください。このビューが初めてロードされた時に呼ばれるメソッドであるviewDidLoadを以下のように編集します。

– (void)viewDidLoad {

[super viewDidLoad];

self.title = @”ナビゲーション;

}

RootViewController は、UITableViewControllerのサブクラスなので、それを使用してタイトルを設定しています。お好きな文字列を設定してみてください。

ここでは、「メインビュー」と設定しています。

この状態でビルドして実行すると以下のようにウインドウ上部にタイトルが表示されます。

5-6

「NextView」をクリックすると以下のように、戻るボタンが設置されているのが分かると思います。

5-7上部に表示された「ナビゲーション」ボタンをクリックすると前のページへ遷移するのが確認できると思います。

投稿日:
カテゴリー: 過去Blog

1件のコメント

コメントする

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