View Switcher(2)~SwitchViewController

2010. 08. 31
前回の『View Switcher(1)~下準備』で、アプリケーションデリゲートにSwitchViewControllerクラスを組み込みましたので、同クラスの中身を作成します。


●SwitchViewController.hの編集

2つのビューの切り替えを行うSwitchViewControllerでは、当該ビューのコントローラであるBlueViewControllerとYellowViewControllerのクラス導入とインスタンス変数、プロパティの宣言と、ビューの切り替えアクションであるswitchViewsの宣言を行います。
(太字が追加した部分)

#import <UIKit/UIKit.h>

@class BlueViewController;
@class YellowViewController;

@interface SwitchViewController : UIViewController {
    BlueViewController *blueViewController;
    YellowViewController *yellowViewController;
}
@property (retain, nonatomic) BlueViewController *blueViewController;
@property (retain, nonatomic) YellowViewController *yellowViewController;

- (IBAction)switchViews:(id)sender;

@end

745


●MainWindow.xibの編集

Xcodeの『グループとファイル』ペインにあるResources下のMainWindow.xibを開き、SwitchViewControllerのインスタンスを追加し、ビューとツールバーを追加します。

まず、LibraryウィンドウからViewControllerをDocumentウィンドウにドラッグ&ドロップして追加します。

746

この際、View Controllerのウィンドウが表示されます。

747

追加したView Controllerが選択されている状態で、InspectorウィンドウのIdentityタブを開き、『Class Identity』の『Class』を『SwitchViewController』に変更します。

748

続いてSwitchViewControllerの管理するビューとツールバーの追加を行います。

先程現れたView Controllerウィンドウに、LibraryウィンドウからViewをドラッグ&ドロップします。

749

ビューの下端にLibraryウィンドウからToolbarをドラッグ&ドロップして設置します。

750

デフォルトで付いてくるBar Button ItemのTitleを『Switch Views』に変更します。

751

次にこのBar Button Itemにアクションの接続を行います。

DocumentウィンドウでSwitch View Controllerを選択し、InspectorウィンドウのConnectionsタブで、『Received Actions』の『switchViews:』をView ControllerウィンドウのBar Button Itemに接続します。

752

最後にアプリケーションデリゲートとビューコントローラのインスタンスを接続します。

DocumentウィンドウでView Switcher App Delegateを選択し、InspectorウィンドウのConnectionsタブで、『Outlets』の『switchViewController』をDocumentウィンドウのSwitch View Controllerに接続します。

753


●SwitchViewController.mの編集

Xcodeに戻り、SwitchViewControllerのソースファイルを編集します。
(太字が追加・修正した部分)

#import "SwitchViewController.h"
#import "BlueViewController.h"
#import "YellowViewController.h"

@implementation SwitchViewController

@synthesize blueViewController;
@synthesize yellowViewController;

- (IBAction)switchViews:(id)sender {
    if (self.yellowViewController == nil) {
        YellowViewController *yellowController = [[YellowViewController alloc] initWithNibName:@"YellowView" bundle:nil];
        self.yellowViewController = yellowController;
        [yellowController release];
    }

    if (self.blueViewController.view.superview == nil) {
        [yellowViewController.view removeFromSuperview];
        [self.view insertSubview:blueViewController.view atIndex:0];
    }
    else {
        [blueViewController.view removeFromSuperview];
        [self.view insertSubview:yellowViewController.view atIndex:0];
    }
}

// The designated initializer. Override if you create the controller programmatically and want to perform customization that is not appropriate for viewDidLoad.
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil {
    if ((self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil])) {
    // Custom initialization
    }
    return self;
}

/*
// Implement loadView to create a view hierarchy programmatically, without using a nib.
- (void)loadView {
}
*/

// Implement viewDidLoad to do additional setup after loading the view, typically from a nib.
- (void)viewDidLoad {
    [super viewDidLoad];
    BlueViewController *blueController = [[BlueViewController alloc] initWithNibName:@"BlueView" bundle:nil];
    self.blueViewController = blueController;
    [self.view insertSubview:blueController.view atIndex:0];
    [blueController release];
}

// Override to allow orientations other than the default portrait orientation.
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
    // Return YES for supported orientations
    return (interfaceOrientation == UIInterfaceOrientationPortrait);
}

- (void)didReceiveMemoryWarning {
    // Releases the view if it doesn't have a superview.
    [super didReceiveMemoryWarning];

    // Release any cached data, images, etc that aren't in use.
}

- (void)viewDidUnload {
    [super viewDidUnload];
    // Release any retained subviews of the main view.
    // e.g. self.myOutlet = nil;
}

- (void)dealloc {
    [blueViewController release];
    [yellowViewController release];
    [super dealloc];
}

@end

754

※2010.9.1訂正
switchViews:メソッドの2つ目の判定文のelseの場合の中で、
[self.view insertSubview:yellowViewController.view atIndex:0];
のyellowViewControllerがblueViewControllerになっていました。
お詫びして訂正させていただきます。

まず、SwitchViewControllerが管理する2つのビューコントローラ(BlueViewControllerとYellowViewController)のヘッダファイルをimportします。

そして両ビューコントローラのプロパティの実装と、deallocでの解放を行っています。

SwitchViewControllerではテンプレートで自動生成されるメソッドの内、initWithNibName:bundle:とviewDidLoad:、shouldAutorotateToInterfaceOrientation:のコメントアウトを解除しています。

shouldAutorotateToInterfaceOrientation:はデバイスの向きに対して、アプリケーションがどの方向に対応するかを示すメソッドで、今回はデフォルトの通常ポートレートのみとなっています。
(shouldAutorotateToInterfaceOrientation:の詳細は『Button Fun』を参照してください)

initWithNibName:bundle:はビューを読み込む前に呼び出されるメソッドで、UIViewControllerクラスの指定イニシャライザです。

今回の場合は、MainWindow.xibの内容に後からビューを追加するため、スーパークラスでの初期化を有効にしています。

viewDidLoadメソッドはnibファイルをメモリに読み込んだ後に追加する処理で、ここではアプリケーション起動時にBlueViewControllerを呼び出して表示するようにしています。

本書やサンプルコードではスーパークラスでの初期化の記述がありませんが、一応残しています。

BlueViewControllerクラスのインスタンスを生成し、initWithNibName:bundle:メソッドでBlueView.xibファイルで初期化してプロパティへ割り当て、insertSubview:atIndex:メソッドでビューを追加し、ビューコントローラのインスタンスはその場で解放しています。

アクションメソッドであるswitchViews:は、最初にYellowViewControllerのインスタンスの有無を確認し、無ければBlueViewControllerと同様にビューコントローラのインスタンスをプロパティへ割り当てます。

そしてどちらのビューに切り替えるかを判別するため、現在blueViewControllerのスーパービューがnilかどうかを判定し、nilであればYelloViewを破棄してBlueViewを挿入、そうでなければBlueViewを破棄してYelloViewを挿入します。


・initWithNibName:bundle:
(UIViewControllerクラス)

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

指定したバンドルのnibファイルで新規に初期化されたビューコントローラを返します。

戻り値は新規に初期化されたUIViewControllerオブジェクトになります。

これはこのクラスの指定イニシャライザです。

nibNameパラメータにnilを指定して、カスタムサブクラスでloadViewメソッドをオーバーライドしない場合、デフォルトのビューコントローラの動作は、ビューコントローラクラスの名前と一致する(.nib拡張子を除いた)nibファイル名を検索します。

もし一つ見つかった場合、クラス名がnibNameプロパティの値になり、結果として対応するnibファイルはこのビューコントローラに関連付けされます。

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

nibBundle:nibファイル検索するためのバンドルを指定します。
このメソッドはnibファイルを検索する際、最初にバンドルの言語指定のプロジェクトディレクトリ内を検索し、その後Resourcesディレクトリを検索します。
nilの場合、このメソッドはメインバンドル内のnibファイルを検索します。


・insertSubview:atIndex:
(UIViewクラス)

- (void)insertSubview:(UIView *)view atIndex:(NSInteger)index

指定したインデックスにサブビューを挿入します。

ビューは一つだけスーパービューを持つことができます。

viewのスーパービューがnilではなく、現在のビューと同じではない場合、このメソッドは現在のビューのサブビューを作成する前に、以前のスーパービューから削除します。

view:挿入するビューを指定します。
この値はnilにすることはできません。

index:サブビューを示す0から始まる値で、サブビューの数以上にすることはできません。


・superview
(UIViewクラス)

@property(nonatomic, readonly) UIView *superview

レシーバのスーパービュー、無い場合はnilになります。(読み込みのみ)


・removeFromSuperview
(UIViewクラス)

- (void)removeFromSuperview

スーパービューとそのウィンドウからレシーバを解除し、レスポンダチェーンから削除します。

レシーバのスーパービューがnilでない場合、このメソッドはレシーバを解放します。

ビューを再利用する予定の場合は、このメソッドを呼び出す前に保持し、それが済んだ後または他のビュー階層に追加した後の適切な時に解放してください。

表示中にこのメソッドを呼び出すことは決してしないでください。



参考文献

UIViewController Class Reference

UIView Class Reference

はじめての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