Nav(1)~概要とルートコントローラ

2011. 01. 01
今回はナビゲーションバーを使用して、階層構造を持つ複数の異なるテーブルビューを扱います。

ページ数が多く色々なことが詰め込んであり、説明も難解で理解しきれていない部分もありますが、できるだけ分かり易く説明していきたいと思います。


●アプリケーションの概要

Navアプリケーションではナビゲーションバーで6つのそれぞれ異なるテーブルビューを管理します。

980

1)Disclosure Buttons

Disclosure Buttonsでは、セルの右側に詳細ボタン(UITableViewCellAccessoryDetailDisclosureButton)を設置し、ボタンをタップした場合と行を選択した場合の2つの動作を行います。

981

詳細ボタンをタップした場合は一段階層を降り、サブビューとして詳細ビューを表示します。

982

行を選択した場合は、アラートが表示されます。

992

2)Check One

Check Oneでは、選択した行の右側にチェックマーク(UITableViewCellAccessoryCheckmark)が表示されるもので、ラジオボタンのように常に一つだけ選択されるような処理にします。

983

3)Row Controls

Row Controlsでは、Cell Accessory Typeではないアクセサリとして、スイッチコントロールを埋め込んでいます。

984

そして行選択時にスイッチの状態変化を反映したアラートを表示するようにします。

985

4)Move Me

Move Meでは行の並べ替えを行います。

986

ナビゲーションバーの右側にあるMoveボタンをタップするとテーブルが編集モードになり、ドラッグ&ドロップで任意に行を入れ替えることができます。

987

5)Delete Me

Delete Meでは行の削除を行います。

988

ナビゲーションバーのDeleteボタンをタップすると編集モードになり、行の左側に出る削除アイコンをタップするとその行の右側にDeleteボタンが現れ、Deleteボタンをタップすると行が削除されます。

989

6)Detail Edit

Detail Editでは、行を選択すると一段階層を降り、サブビューとして詳細ビューを表示します。

990

詳細ビューではセルの内容を編集することができるようにするため、ナビゲーションバーに編集内容を保存するか否かを決定するCancelボタンとSaveボタンがあります。

991

行をタップするとセルの内容を編集することができます。

993



●プロジェクトの作成

ナビゲーションバーを有するアプリケーションの作成の場合、通常はNavigation-based Applicationテンプレートを使用します。

970

しかし今回はナビゲーションベースのアプリケーションの構造を勉強するのが目的ですので、Window-based Applicationテンプレートを使用します。

971

View-based Applicationテンプレートで、プロジェクト名を『Nav』とします。

972


●『ナビゲーションコントローラを配置する』について

本書の『ナビゲーションコントローラを配置する』の説明は難解です。

これは、本書ではRootViewControllerと名付けしているクラスが、Apress社のサイト内のサンプルコードではFirstLevelViewControllerと名付けしていることから、新版では説明が修正されていることと思われます。

今回のアプリケーションの階層構造は、以下のようになっています。

ルートコントローラ(ナビゲーションコントローラ):navController(NavAppDelegate)
        |
        ∟ルートビューコントローラ:RootViewController(FirstLevelViewController)
                        |
                        ∟Disclosure Buttons
                        |
                        ∟Check One
                        |
                        ∟Row Controls
                        |
                        ∟Move Me
                        |
                        ∟Delete Me
                        |
                        ∟Detail Edit

『ルートコントローラとルートビューコントローラが混同し易いので、ルートコントローラをnavControllerと呼ぶ』という部分は理解できるのですが、『rootViewControllerプロパティ云々』の部分はよく分からないので無視します。

ここでは新版のサンプルコードに従って、ルートビューコントローラのクラスをFirstLevelViewControllerとして作成します。


●ルートビューコントローラFirstLevelViewControllerの作成

ルートコントローラを編集する前に、ルートコントローラとルートビューコントローラを接続する必要があるため、最初にルートビューコントローラFirstLevelViewControllerを作成します。

本書ではUIViewController subclassテンプレートを選択して作成していますが、テーブルビューコントローラなのでオプションの『UITableViewController subclass』にチェックを入れて生成します。

不要なメソッドが自動生成されるなどのデメリットも指摘されていますが、必要なメソッドが自動生成されるので、不用意なミスを低減するためにはテンプレートを使用した方が良いと思います。
(不要なメソッドは削除すればいいだけですので)

Xcodeの『Classes』を右クリックして『追加』→『新規ファイル...』を選択します。

975

左ペインのiOSカテゴリからCocoa Touch Classを選択し、右上ペインでUIViewController subclassを、右下ペインのオプションでUITableViewController subclassにチェックを入れ、ファイル名をFirstLevelViewControllerとします。

994


●ルートコントローラのヘッダファイルNavAppDelegate.hの編集

ルートコントローラNavAppDelegateでは、ナビゲーションコントローラの設置を行います。
(太字が追加した部分)

#import <UIKit/UIKit.h>

@interface NavAppDelegate : NSObject <UIApplicationDelegate> {
    UIWindow *window;
    UINavigationController *navController;
}

@property (nonatomic, retain) IBOutlet UIWindow *window;
@property (nonatomic, retain) IBOutlet UINavigationController *navController;

@end

995

ナビゲーションコントローラのアウトレットとしてプロパティnavControllerを宣言しています。

旧版の本書では(太字になっていませんが)『@class NavViewController;』が追加されていますが、この文は不要です。


●ルートコントローラのソースファイルNavAppDelegate.mの編集

ソースファイルではプロパティnavControllerの実装とdeallocでの解放、アプリケーションウィンドウへのナビゲーションコントローラのビューの追加を行っています。
(太字が追加した部分)

#import "NavAppDelegate.h"

@implementation NavAppDelegate

@synthesize window;
@synthesize navController;

#pragma mark -
#pragma mark Application lifecycle

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {

    // Override point for customization after application launch.
    [self.window addSubview:navController.view];
    [self.window makeKeyAndVisible];

    return YES;
}

- (void)applicationWillResignActive:(UIApplication *)application {
    /*
    Sent when the application is about to move from active to inactive state. This can occur for certain types of
     temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the
     application and it begins the transition to the background state.
    Use this method to pause ongoing tasks, disable timers, and throttle down OpenGL ES frame rates. Games
     should use this method to pause the game.
    */

}

- (void)applicationDidEnterBackground:(UIApplication *)application {
    /*
    Use this method to release shared resources, save user data, invalidate timers, and store enough
    application state information to restore your application to its current state in case it is terminated later.
    If your application supports background execution, called instead of applicationWillTerminate: when the
    user quits.
    */

}

- (void)applicationWillEnterForeground:(UIApplication *)application {
    /*
    Called as part of transition from the background to the inactive state: here you can undo many of the
    changes made on entering the background.
    */

}

- (void)applicationDidBecomeActive:(UIApplication *)application {
    /*
    Restart any tasks that were paused (or not yet started) while the application was inactive. If the application
    was previously in the background, optionally refresh the user interface.
    */

}

- (void)applicationWillTerminate:(UIApplication *)application {
    /*
    Called when the application is about to terminate.
    See also applicationDidEnterBackground:.
    */

}

#pragma mark -
#pragma mark Memory management

- (void)applicationDidReceiveMemoryWarning:(UIApplication *)application {
    /*
    Free up as much memory as possible by purging cached data objects that can be recreated (or reloaded
    from disk) later.
    */

}

- (void)dealloc {
    [navController release];
    [window release];
    [super dealloc];
}

@end

996

アプリケーションの起動完了後の処理application:didFinishLaunchingWithOptions:メソッドでは、ウィンドウにナビゲーションコントローラのビューをaddSubview:メソッドとviewプロパティで追加しています。

本書やサンプルコードでは古いapplicationDidFinishLaunching:のため『[window ~』という記述になっていますが、ここでは(makeKeyAndVisibleの記述に倣って)『[self.window ~』としています。


●MainWindow.xibの編集

アプリケーションのウィンドウに、ルートコントローラであるナビゲーションコントローラnavControllerとルートビューコントローラのFirstLevelViewControllerを設置します。

Resources下のMainWindow.xibをダブルクリックして、Interface Builderで開きます。

1)ナビゲーションコントローラの追加

LibrayウィンドウからNavigation ControllerをDocumentウィンドウへドラッグ&ドロップします。

997

2)アウトレットnavControllerの接続

DocumentウィンドウでNav App Delegateを選択し、InspectorウィンドウのConnectionsパネルを開き、NavAppDelegate.hで宣言したアウトレットnavControllerをDocumentウィンドウのNavigation Controllerに接続します。

998

3)ルートビューコントローラのクラス変更

ルートビューコントローラ(ナビゲーションコントローラのビューコントローラ)のクラスをFirstLevelViewControllerに変更します。

DocumentウィンドウのNavigation Controller下にあるView Controller(Root View Controller)を選択し、InspectorウィンドウのIdentityパネルを開き、Class IdentityのClassをFirstLevelViewControllerに変更します。

999

1000



参考文献

はじめてのiPhone3プログラミングはじめてのiPhone3プログラミング
(2009/12/17)
Dave Mark、Jeff LaMarche 他

商品詳細を見る






Bose Solo 5 TV sound system
0 Comments
Leave a comment
管理者にだけ表示を許可する
Top
0 Trackbacks
Top
Calendar
07 | 2017/08 | 09
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 31 - -
Recent Articles
iTunes


Swift
Categories
Tips
Profile

水月杏香

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

Wish List
WACOM


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

ボーズ・オンラインストア
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