チュートリアル:ナビゲーションバーを使う

2010. 05. 07
iPhone SDKプログラミング大全』の『チュートリアル:ナビゲーションバーを使う』ですが、例によってサンプルコードの事前説明が無いので、最終形態を説明します。
このサンプルは、ナビゲーションバーを利用した2段階層のテーブルを表示します。
(表示するだけで、編集などはできません)

255

256

ここで示すサンプルでは以下のような階層構造になります。

ナビゲーションコントローラ:NavBarAppDelegate
        |
        ∟THE IDOLM@STER SP(親ビューコントローラ:RootViewController)
                    |
                    ∟Wandering Star(子ビューコントローラ1)
                    |        ∟萩原雪歩
                    |        ∟水瀬伊織
                    |        ∟双海 亜美/真美
                    |        ∟四条 貴音
                    |
                    ∟Perfect Sun(子ビューコントローラ2)
                    |        ∟天海 春香
                    |        ∟菊地 真
                    |        ∟高槻 やよい
                    |        ∟我那覇 響
                    |
                    ∟Missing Moon(子ビューコントローラ3)
                             ∟如月 千早
                             ∟秋月 律子
                             ∟三浦 あずさ
                             ∟星井 美希

本来はビューコントローラが4つ必要になるのですが、本書の場合は1つファイルに親と子の2つのビューコントローラをまとめており、内部で条件分岐して表示しています(子ビューコントローラ1~3は条件分岐で1つのコントローラとし、親ビューコントローラのファイル内に含めている)ので、実用的なアプリケーションを組む際には注意しましょう。


●新規プロジェクトの作成

XcodeでNavigation-Based Applicationテンプレートを選択し、『NavBar』という名前の新規プロジェクトを作成します。

248

249

『Classes』下にある、『NavBarAppDelegate』がナビゲーションコントローラ、『RootViewController』がビューコントローラになります。


●NavBarAppDelegate.mの編集

本書では最後に編集していますが、話の流れとして自然になるように、ここでは最初にナビゲーションコントローラの説明を先にします。

NavBarAppDelegate.mでは、ビューコントローラ(RootViewController)を指揮下に置き、そのタイトルと親テーブルの配列(names。要素数3)を設定します。
(太字が追記した部分)

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    // Override point for customization after app launch
    // RootViewControllerを取得
    RootViewController *rootViewController;
    rootViewController = (RootViewController *)navigationController.topViewController;


    // RootViewControllerを設定
    rootViewController.title = @"THE IDOLM@STER SP";
    rootViewController.names = [NSArray arrayWithObjects:@"Wandering Star", @"Perfect Sun", @"Missing Moon", nil];


    // ウィンドウの設定と表示を処理
    [window addSubview:[navigationController view]];
    [window makeKeyAndVisible];
    return YES;
}

254


・topViewController

@property(nonatomic, readonly, retain) UIViewController *topViewController

ナビゲーションスタック(ナビゲーションコントローラの管理する階層)最上位のビューコントローラを指します


●RootViewController.hの編集

ナビゲーションコントローラ(NavBarAppDelegate)下に置いた親ビューコントローラ(RootViewController)を編集します。

親テーブルのnames配列の宣言と、プロパティ宣言をします。
(太字が追記した部分)

@interface RootViewController : UITableViewController {
    NSArray *names;
}

@property (retain) NSArray *names;

@end

250


●RootViewController.mの編集

親ビューコントローラと子ビューコントローラを追加します。

本書の記載の仕方では編集箇所が分かり難いので、分割して説明します。
(スクリーンショットの行番号を参考にしてください)

まずヘッダファイルで宣言した、親テーブルのnames配列のプロパティを実装します。
(太字が追記した部分)

@implementation RootViewController

// プロパティを実装
@synthesize names;

251

続いて必須メソッドである、セクションの行数指定(tableView:numberOfRowsInSection:)とセル名指定(tableView:cellForRowAtIndexPath:)を実装します。
(太字が追記・編集した部分)

// Customize the number of rows in the table view.
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    // namesの数を返す
    return [names count];

}


// Customize the appearance of table view cells.
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

    static NSString *CellIdentifier = @"Cell";

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
    }

    // Configure the cell.
    // セルの名前を設定
    cell.textLabel.text = [names objectAtIndex:indexPath.row];


    return cell;
}

252

最後に、親テーブルでセルを選択した後に子テーブルへ移動するメソッド(tableView:didSelectRowAtIndexPath:)と、子テーブルの配列(childNames。if分で条件分岐し、3つを共有しています)を実装します。
(太字が追記した部分)

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

    /*
    <#DetailViewController#> *detailViewController = [[<#DetailViewController#> alloc] initWithNibName:@"<#Nib name#>" bundle:nil];
    // ...
    // Pass the selected object to the new view controller.
    [self.navigationController pushViewController:detailViewController animated:YES];
    [detailViewController release];
    */

    // 名前を取得
    NSString *name;
    name = [names objectAtIndex:indexPath.row];

    // 子供となるコントローラに表示する内容を決定
    NSArray *childNames = nil;
    if ([name isEqualToString:@"Wandering Star"]) {
        childNames = [NSArray arrayWithObjects:@"萩原 雪歩", @"水瀬 伊織", @"双海 亜美/真美", @"四条 貴音", nil];
    }
    if ([name isEqualToString:@"Perfect Sun"]) {
        childNames = [NSArray arrayWithObjects:@"天海 春香", @"菊地 真", @"高槻 やよい", @"我那覇 響", nil];
    }
    if ([name isEqualToString:@"Missing Moon"]) {
        childNames = [NSArray arrayWithObjects:@"如月 千早", @"秋月 律子", @"三浦 あずさ", @"星井 美希", nil];
    }

    if (childNames) {
        // RootViewControllerをインスタンス化
        RootViewController *childViewController;
        childViewController = [[RootViewController alloc] initWithNibName:@"RootViewController" bundle:nil];
        [childViewController autorelease];

        // RootViewControllerを設定する
        childViewController.title = name;
        childViewController.names = childNames;

        // RootViewControllerをコントローラスタックに追加
        [self.navigationController pushViewController:childViewController animated:YES];
    }

}

253

親テーブルのnames配列で選択された行をname文字列とし、isEqualToString:メソッドで選択行の判別をしています。

判別後、子テーブルのchildName配列の内容を設定しています。

そして子テーブルのRootViewControllerのインスタンスを生成、コントローラスタックに追加します。

・tableView:didSelectRowAtIndexPath:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath

現在選択した行のデリゲートを知らせます

このメソッドで、デリゲートは選択肢を処理します

選択した行を排他的にチェックマークの画像(UITableViewCellAccessoryCheckmark)を付けることもできます

このメソッドは、テーブルの編集プロパティがYESに設定されている(つまりテーブルビューが編集モードになっている)場合は呼び出しできません

詳細は『iOS Table Viewプログラミングガイド』の『第6章 選択の管理』を参照してください

tableView:新たに選択した行のデリゲートをテーブルビューオブジェクトに知らせます

indexPath:テーブルビューの新たに選択した行のインデックスパスを指定します


・initWithNibName:bundle:

- (id)initWithNibName:(NSString *)nibName bundle:(NSBundle *)nibBundle

指定されたバンドルのnibファイルと新規に初期化されたビューコントローラ(UIViewControllerオブジェクト)を返します

このメソッドは、このクラスの指定イニシャライザです

nibNameパラメータにnilを指定し、カスタムサブクラスの中でloadViewメソッドをオーバーライドをしていない場合は、nibファイルの中からデフォルトのビューコントローラの名前(.nibなどの拡張子を除く)と適合するビューコントローラクラスの名前を探します

1つ見つかった場合、nibNameプロパティの値に適するクラス名か、このビューコントローラと関連するnibファイルと一致するどちらかになります

nibName:パス情報の無いnibファイル名を指定します
nibファイルを読み込んだ後にnibNameを設定したい場合、viewDidLoadメソッドをオーバーライドする必要があります
この引数がnilの場合、nibNameプロパティはnilに設定されます
この場合、ビュープロパティの設定でloadViewメソッドをオーバーライドする必要があります

nibBundle:nibファイルを検索するバンドルを指定します
このメソッドは、最初にバンドルの言語固有のプロジェクトディレクトリの中のnibファイルを探し、続いてリソースディレクトリを検索します
nilの場合、このメソッドはメインバンドル内のnibファイルを検索します


・pushViewController:animated:

- (void)pushViewController:(UIViewController *)viewController animated:(BOOL)animated

ビューコントローラをプッシュし(階層を掘って)、レシーバのスタックと表示を更新します

viewControllerパラメータ内のオブジェクトが、ナビゲーションスタックの一番上のビューコントローラになります

ビューコントローラをプッシュすると、表示しているビューの管理になります

animatedパラメータにより、ビューの表示が決定されます

animatedパラメータがYESの場合は、ビューがアニメーションで挿入され、そうでない場合は単純にビューが切り替わります

表示する前、ナビゲーションバーやツールバーがある場合は、ビューは自動的にサイズ調整して表示します

スタックの最上部に新しいビューコントローラと関連するビューを追加表示する場合、このメソッドはナビゲーションバーやツールバーも表示を更新します

iPhone OS 3.0以降では、新しいビューコントローラのツールバーアイテムが反映され、組み込みのナビゲーションツールバーの内容が更新されています
(『UINavigationController Class Reference/Updating the Navigation Bar』参照)

重要:iPhone OS 2.2以降では、viewControllerパラメータ内のオブジェクトが既にナビゲーションスタックにある場合、このメソッドは例外を発生します
(それ以前のバージョンのiPhone OSでは、何もしません)

viewController:スタックにプッシュするビューコントローラを指定します
このオブジェクトはタブバーコントローラのインスタンスや、既にスタックしているナビゲーションスタックを指定できません

animated:YESを指定した場合はアニメーションでビューを切り替え、NOの場合はアニメーションしません
ナビゲーションコントローラの起動時にNOを指定することもできます


●ビルドと実行

実行すると親テーブルが表示されます。

255

『Wandering Star』を選択した場合

256

『Perfect Sun』を選択した場合

257

『Missing Moon』を選択した場合

258



参考文献

iOS Table Viewプログラミングガイド

UINavigationController Class Reference

UITableViewDelegate Protocol Reference

UIViewController Class Reference

iPhone SDK 3 プログラミング大全 実践プログラミング (MacPeople Books)iPhone SDK 3 プログラミング大全 実践プログラミング (MacPeople Books)
(2009/09/08)
木下 誠

商品詳細を見る






SoundLink Mini Bluetooth speaker_ii_limited
0 Comments
Leave a comment
管理者にだけ表示を許可する
Top
0 Trackbacks
Top
Calendar
05 | 2017/06 | 07
Sun Mon Tue Wed Thu Fri Sat
- - - - 1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 -
Recent Articles
iTunes


Swift
Categories
Tips
Profile

水月杏香

Author:水月杏香
永遠の初心者プログラマ。

Wish List
WACOM


ARC
Technical Q&A
情報プロパティリストキー
Start Developing iOS Apps Today
BOSE

SoundLink Mini Bluetooth speaker_ii_limited
Reference
NSApplicationDelegateプロトコル
NSArrayクラス
NSAutoreleasePoolクラス
NSBundleクラス
NSBundle UIKit追加分
NSCalendarクラス
NSCoderクラス
NSCodingプロトコル
NSCopyingプロトコル
NSDataクラス
NSDateクラス
NSDateFormatterクラス
NSDictionaryクラス
NSEntityDescriptionクラス
NSEnumeratorクラス
NSErrorクラス
NSExceptionクラス
NSFetchRequestクラス
NSFileHandleクラス
NSFileManagerクラス
NSIndexPathクラス
NSIndexPath UIKit追加分
NSKeyedArchiverクラス
NSKeyedUnarchiverクラス
NSKeyValueCodingプロトコル
NSLocaleクラス
NSManagedObjectクラス
NSManagedObjectContextクラス
NSManagedObjectModelクラス
NSMutableArrayクラス
NSMutableCopyingプロトコル
NSMutableDictionaryクラス
NSMutableSetクラス
NSNotificationクラス
NSNotificationCenterクラス
NSNullクラス
NSNumberクラス
NSObjectクラス
NSObject UIKit追加分
NSObjectプロトコル
NSPersistentStoreクラス
NSPersistentStoreCoordinatorクラス
NSPredicateクラス
NSPropertyListSerializationクラス
NSRunLoopクラス
NSSetクラス
NSStringクラス
NSString UIKit追加分
NSTimerクラス
NSTimeZoneクラス
NSURLクラス
NSURLProtectionSpaceクラス
NSURLRequestクラス
NSUserDefaultsクラス
NSValueクラス

UIActionSheetクラス
UIActionSheetDelegateプロトコル
UIActivityIndicatorViewクラス
UIAlertViewクラス
UIAlertViewDelegateプロトコル
UIApplicationクラス
UIApplicationDelegateプロトコル
UIBarButtonItemクラス
UIBarItemクラス
UIButtonクラス
UIColorクラス
UIControlクラス
UIDatePickerクラス
UIDeviceクラス
UIEventクラス
UIFontクラス
UIGestureRecognizerクラス
UIImageクラス
UIImageViewクラス
UIKit Function
UILabelクラス
UINavigationControllerクラス
UINavigationItemクラス
UIPickerViewクラス
UIPickerViewDataSourceプロトコル
UIPickerViewDelegateプロトコル
UIPinchGestureRecognizerクラス
UIResponderクラス
UIScreenクラス
UIScrollViewクラス
UISearchBarクラス
UISearchBarDelegateプロトコル
UISegmentedControlクラス
UISliderクラス
UISwipeGestureRecognizerクラス
UISwitchクラス
UITableViewクラス
UITableViewCellクラス
UITableViewControllerクラス
UITableViewDataSourceプロトコル
UITableViewDelegateプロトコル
UITapGestureRecognizerクラス
UITextFieldクラス
UITextFieldDelegateプロトコル
UITextInputTraitsプロトコル
UITextViewクラス
UITextViewDelegateプロトコル
UIToolbarクラス
UITouchクラス
UIViewクラス
UIViewControllerクラス
UIWebViewクラス
UIWebViewDelegateプロトコル
UIWindowクラス

AVAudioPlayerクラス
AVAudioPlayerDelegateプロトコル

CADisplayLinkクラス
CAEAGLLayerクラス
CALayerクラス

CGAffineTransform
CGBitmapContext
CGColor
CGColorSpace
CGContext
CGGeometry
CGImage
CGPath

EAGLContextクラス
EAGLDrawableプロトコル

Foundation Constants
Foundation Data Types
Foundation Functions

MPMediaItemクラス
MPMediaItemArtworkクラス
MPMediaPlaylistクラス
MPMediaPropertyPredicateクラス
MPMediaQueryクラス
MPMusicPlayerControllerクラス

Randomization Services

System Sound Services
Amazon


OpenGL ES
SQLite
Monthly Archives
Recent Comments
Recent TrackBacks
RSS Link
Visitors
QR Code
QR