View Switcher(1)~下準備

2010. 08. 29
はじめてのiPhoneプログラミング』の次のお題は、マルチビューアプリケーションの作成です。

ツールバーの切り替えボタンをタップすることで、2つのビューを入れ替えるアプリケーションを、Window-Based Applicationテンプレートを使って一から構築します。


●プロジェクトの作成

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

734


●ビューコントローラとnibファイルの追加

ビューを切り替えるコントローラと、2つのビューの内容を表すソースファイル、ビューのベースとなる2つのnibファイルをプロジェクトに追加します。

まず、『グループとファイル』で『Classes』を右クリックし、『追加』→『新規ファイル...』を選択します。

左ペインで『iPhone OS』下の『Cocoa Touch Class』を選択し、右上ペインの『UIViewController Subclass』を選択して『次へ』に進みます。

735

ファイル名を『SwitchViewController.m』とし、『同時に"~.h"も作成』のチェックを入れたまま『完了』を押します。

736

同様にビュー内容を表す『BlueViewController』と『YellowViewController』を、UIViewController Subclassとして作成します。

737

続いてnibファイルを追加します。

『グループとファイル』で『Resources』を右クリックし、『追加』→『新規ファイル...』を選択します。

左ペインで『iPhone OS』下の『User Interface』を選択し、右上ペインの『View XIB』を選択して『次へ』に進みます。

738

ファイル名を『BlueView.xib』として『完了』を押します。

739

同様に『YellowView.xib』を作成します。

740


●アプリケーションデリゲートのコード修正

自動生成されるアプリケーションデリゲートに、メインの制御クラスであるSwitchViewControllerを扱えるようにコードを修正します。
(太字が追加した部分)

#import <UIKit/UIKit.h>

@class SwitchViewController;

@interface View_SwitcherAppDelegate : NSObject {
    UIWindow *window;
    SwitchViewController *switchViewController;
}

@property (nonatomic, retain) IBOutlet UIWindow *window;
@property (nonatomic, retain) IBOutlet SwitchViewController *switchViewController;

@end

741

※2010.8.30訂正
『@class SwitchViewController』の部分で、行末のセミコロンが抜けていました。
お詫びして訂正させていただきます。

View_SwitcherAppDelegate.hでは、最初にアプリケーションのメイン処理となるSwitchViewControllerクラスを追加します。

旧版の本文中では『@class View_SwitcherViewController;』を中線で消していますが、これはView-Based Applicationテンプレートを使用した際に自動生成されるもので、今回のようにWindow-Based Applicationテンプレートを使用した場合は存在しません。

@classは『詳解 Objective-C 2.0』によるとクラスを宣言するコンパイラ指示子とあり、アプリケーションデリゲートにSwitchViewControllerクラスを使うことを宣言していることになります。

ここで#importではなく@classを使用しているのは、STUDIOT::DEVLOGさんの『@classと#importの使い分け』を参考に考えてみると、SwitchViewControllerクラスのアウトレットをプロパティを扱うだけで、中身はSwitchViewControllerクラスそのもので行うためのようです。

実際、View_SwitcherをView-Based Applicationテンプレートでプロジェクトを作成してみると、View_SwitcherAppDelegate.hは以下のようになります。

#import <UIKit/UIKit.h>

@class View_SwitcherViewController;

@interface View_SwitcherAppDelegate : NSObject {
    UIWindow *window;
    View_SwitcherViewController *viewController;
}

@property (nonatomic, retain) IBOutlet UIWindow *window;
@property (nonatomic, retain) IBOutlet View_SwitcherViewController *viewController;

@end

742

このようにView-Basedテンプレートでは、ビューコントローラView_SwitcherViewControllerを@classで宣言しています。

次にインスタンス変数とプロパティの宣言ですが、これまでインスタンス変数の宣言時にIBOutletを付けていて、旧版本文中やサンプルコードでもそのようになっているのですが、テンプレートで自動生成された内容ではプロパティの宣言にIBOutletを付けていますので、ここではその書式に従うことにします。

ビューコントローラのインスタンスswitchViewControllerをアウトレットとし、プロパティを宣言します。

続いてView_SwitcherAppDelegate.mの修正を行います。
(太字が追加した部分)

#import "View_SwitcherAppDelegate.h"
#import "SwitchViewController.h"

@implementation View_SwitcherAppDelegate

@synthesize window;
@synthesize switchViewController;

#pragma mark -
#pragma mark Application lifecycle

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

    // Override point for customization after application launch.
    [window addSubview:switchViewController.view];
    [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 {
    [switchViewController release];
    [window release];
    [super dealloc];
}

@end

743

ビューコントローラのヘッダファイルSwitchViewController.hの読み込み、プロパティの実装、deallocでの解放は、View-Based Applicationテンプレートで自動生成される内容と同じです。

#import "View_SwitcherAppDelegate.h"
#import "View_SwitcherViewController.h"

@implementation View_SwitcherAppDelegate

@synthesize window;
@synthesize viewController;

#pragma mark -
#pragma mark Application lifecycle

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

    // Override point for customization after application launch.

    // Add the view controller's view to the window and display.
    [window addSubview:viewController.view];
    [window makeKeyAndVisible];

    return YES;
}

(中略)

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

@end

744

applicationDidFinishLaunching:は、アプリケーションの起動が完了したことをデリゲートに伝えるメソッドで、iOS 3.0以降はapplication:didFinishLaunchingWithOptions:に置き換えられています。
(詳細は『UIApplicationDelegateプロトコル』を参照してください)

メソッドが置換されていますが内容はほぼ同じで、ビューコントローラの管理するビューをサブビューとしてウィンドウに追加するメソッドが書き加えられています。
(addSubView:メソッドについては『音楽プレイヤのメソッド(1)』を参照してください)


・view
(UIViewControllerクラス)

@property(nonatomic, retain) UIView *view

コントローラが管理するビューです。

このプロパティで格納されるビューはビューコントローラのビュー階層のルートビューを表します。

ビューコントローラが(モーダルまたはビューコントローラベースのインターフェイスの一部を)画面に提示する時は常に、アプリケーションのウィンドウにこのビューを取得して表示します。

このプロパティのデフォルト値はnilです。

現在この値がnilの時にこのプロパティでアクセスすると、ビューコントローラは自動的にloadViewメソッドを呼び出し、その結果のビューを返します。

デフォルトのloadViewメソッドは、(もしあれば)ビューコントローラに関連付けされたnibファイルからビューの読み込みを試みます。

ビューコントローラが関連付けされたビューコントローラを持っていない場合、loadViewメソッドをオーバーライドし、ルートビューと全てのサブビューの生成に使用します。

各ビューコントローラオブジェクトは、そのビューの唯一の所有者です。

複数のビューコントローラオブジェクトが、同じビューオブジェクトを関連付けすることはできません。

このプロパティがアクセスする自動的に読み込まれるビューは、isViewLoadedプロパティを使って現在のメモリ内にあるか確認することができます。

isViewLoadedプロパティはviewプロパティと異なり、現在のメモリ内にビューが存在しない場合はビューを読み込むことはできません。

UIViewControllerクラスは、メモリ不足状態の間はこのプロパティをnilに設定し、ビューコントローラ自身が最終的に解放します。



参考文献

STUDIOT::DEVLOG/@classと#importの使い分け

UIViewController Class Reference

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

商品詳細を見る

詳解 Objective-C 2.0 第3版詳解 Objective-C 2.0 第3版
(2011/12/28)
荻原 剛志

商品詳細を見る






SoundSport Pulse wireless headphones
0 Comments
Leave a comment
管理者にだけ表示を許可する
Top
0 Trackbacks
Top
Calendar
04 | 2017/05 | 06
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

SoundSport Pulse wireless headphones
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