Copyright (C) iPhoneアプリ開発備忘録 All rights reserved.
ブログ内で記したコード、内容の正確性は保証いたしません。
記載内容を実装したことにより発生した不具合・損害等の責任は一切負いません。



2011年10月11日

UISplitViewにUINavigationController を実装する その2



UISplitViewを実装したiPadアプリを開発するとき、New ProjectのテンプレートにSplit View-Based Applicationを選択すると、シンプルな2ペインのViewを実装したアプリが作られる。

これにUINavigationControllerを実装する方法。
ここでは、左ペインをRootViewController、右ペインをDetailViewControllerとする。
本記事は、右ペインでUINavigationControllerを実装するコードを記述する。(該当部分のみ記載)

(1) AppDelegate.h
#import <UIKit/UIKit.h>
#import "RootViewController.h"
#import "DetailViewController.h"

@class DetailViewController;



(2) AppDelegate.m
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions

UIWindow *window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];

RootViewController *rootViewController = [[RootViewController alloc] init];
DetailViewController *detailViewController = [[DetailViewController alloc] init];

UINavigationController* navigationControllerRight = [[UINavigationController alloc] initWithRootViewController:detailViewController];

rootViewController.detailViewController = detailViewController;

[navigationControllerRight setNavigationBarHidden:YES animated:YES]; // NavigationBarを隠す

UISplitViewController *splitViewController = [[UISplitViewController alloc] init];
splitViewController.viewControllers = [NSArray arrayWithObjects:rootViewController, navigationControllerRight, nil];
splitViewController.delegate = detailViewController;

[window addSubview:splitViewController.view];
[rootViewController release];
[navigationControllerLeft release];
[detailViewController release];

※ポイント
・navigationControllerRightをdetailViewControllerで初期化することにより、右ペインにUINavigationControllerを設定する。
・splitViewController.viewControllersに、左ペイン(rootViewController)、右ペイン(UINavigationControllerを設定したViewController(detailViewController))を設定する。NSArrayに設定する順序は上記の通りとすること。入れ替えると表示が崩れるので注意。
・右ペインにUINavigationControllerを設定すると、画面最上部全体にNavigationBarが表示されるため、 [navigationControllerRight setNavigationBarHidden:YES animated:YES]; によりNavigationBarを隠す。


(3) RootViewController.h
#import <UIKit/UIKit.h>

@class DetailViewController;

@interface RootViewController : UITableViewController
{
DetailViewController *detailViewController;

}

@property (nonatomic, retain) DetailViewController *detailViewController;

@end



(4) RootViewController.m
#import "RootViewController.h"
#import "DetailViewController.h"

@implementation RootViewController

@synthesize detailViewController;

- (void)viewDidLoad
{
[super viewDidLoad];
self.clearsSelectionOnViewWillAppear = NO;
self.contentSizeForViewInPopover = CGSizeMake(320.0, 600.0);

}

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

detailViewController.detailItem = @"hoge";

}

※ポイント
・セルが選択されたら、右ペイン(detailViewController)を表示。
detailViewController.detailItemで、detailItemのセッターを呼び出す。


(5) DetailViewController.h
#import <UIKit/UIKit.h>

@class RootViewController;
@class NextDetailViewController;

@interface DetailViewController : UIViewController <UIPopoverControllerDelegate, UISplitViewControllerDelegate>
{
NextDetailViewController *nextDetailViewController;
}

@property (nonatomic, assign) RootViewController *rootViewController;
@property (nonatomic, retain) IBOutlet UIToolbar *toolbar;
@property (nonatomic, retain) NSString detailItem;
@property (nonatomic, retain) NextDetailViewController *nextDetailViewController;

@end



(6) DetailViewController.m
#import "DetailViewController.h"

#import "RootViewController.h"
#import "NextDetailViewController.h"

@interface DetailViewController ()
@property (nonatomic, retain) UIPopoverController *popoverController;
- (void)configureView;
@end

@implementation DetailViewController

@synthesize toolbar = _toolbar;
@synthesize detailItem = _detailItem;
@synthesize detailDescriptionLabel = _detailDescriptionLabel;
@synthesize popoverController = _myPopoverController;
@synthesize rootViewController = _rootViewController;


- (void)setDetailItem:(NSString *)stringItem
{
if (_detailItem != stringItem) {
[_detailItem release];
_detailItem = [stringItem retain];

// Update the view.
[self configureView];
}

if (self.popoverController != nil) {
[self.popoverController dismissPopoverAnimated:YES];
}
}

- (void)configureView
{

[self.navigationController setNavigationBarHidden:YES animated:YES]; // NavigationBarを隠す

self.detailDescriptionLabel.text = self.detailItem;
}

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
return YES;
}

#pragma mark - Split view support

- (void)splitViewController:(UISplitViewController *)svc willHideViewController:(UIViewController *)aViewController withBarButtonItem:(UIBarButtonItem *)barButtonItem forPopoverController: (UIPopoverController *)pc
{
barButtonItem.title = @"Events";
NSMutableArray *items = [[self.toolbar items] mutableCopy];
[items insertObject:barButtonItem atIndex:0];
[self.toolbar setItems:items animated:YES];
[items release];
self.popoverController = pc;
}

// Called when the view is shown again in the split view, invalidating the button and popover controller.
- (void)splitViewController:(UISplitViewController *)svc willShowViewController:(UIViewController *)aViewController invalidatingBarButtonItem:(UIBarButtonItem *)barButtonItem
{
NSMutableArray *items = [[self.toolbar items] mutableCopy];
[items removeObjectAtIndex:0];
[self.toolbar setItems:items animated:YES];
[items release];
self.popoverController = nil;
}

- (id)init {

if (self = [super init]) {
self.view.backgroundColor = [UIColor whiteColor];

_toolbar = [[UIToolbar alloc] init];
[_toolbar sizeToFit];
[self.view addSubview:_toolbar];
[_toolbar setItems: [NSArray array]];

[self configureView];

}
return self;
}

- (void)viewWillAppear:(BOOL)animated {

[super viewWillAppear:animated];

[self.navigationController setNavigationBarHidden:YES animated:YES]; // NavigationBarを隠す

}

/*
// Implement viewDidLoad to do additional setup after loading the view, typically from a nib.
- (void)viewDidLoad
{
[super viewDidLoad];
}
*/

- (void)viewDidUnload
{
[super viewDidUnload];

// Release any retained subviews of the main view.
// e.g. self.myOutlet = nil;
self.popoverController = nil;
}

#pragma mark - Memory management

- (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)dealloc
{
[_myPopoverController release];
[_toolbar release];
[_detailItem release];
[_detailDescriptionLabel release];
[super dealloc];
}

※ポイント
・左ペイン(rootViewController)にUINavigationControllerを設定する場合との違いは、NavigationBarを隠す処理が必要なこと。
DetailViewControllerではPopOverControllerの表示用にToolBarを表示するため、NavigationBarを表示すると画面上部に二重にBarが表示されてしまうためである。
DetailViewControllerは、UINavigationControllerの最上位階層であるため、NavigationBarは不要なので隠す処理を行う。
この処理はViewが表示されるときに必要なので、configureViewメソッド、viewWillAppearメソッドで行う。
・左ペイン(rootViewController)から呼び出されると、セッターであるsetDetailItemが実行される。
・右ペインから次のView(NextViewController)をUINavigationControllerを使用して表示する場合は、pushViewControllerを使用する。
・NextViewControllerではNavigationBarを隠す処理は行わない。

(7) DetailView.xib
DetailViewControllerのxibには、画面上部にToolBarを設置し、DetailViewController.hのIBoutletと接続しておくこと。
テンプレートから作成した場合は、あらかじめToolBarは作成されている。

タグ:iPAD IOS
posted by mobileDeveloper at 14:18 | Comment(0) | TrackBack(0) | UISplitView はてなブックマーク - UISplitViewにUINavigationController を実装する その2 | このブログの読者になる | 更新情報をチェックする
この記事へのコメント
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント:

認証コード: [必須入力]


※画像の中の文字を半角で入力してください。
※ブログオーナーが承認したコメントのみ表示されます。

この記事へのトラックバック
Apple、Appleのロゴ、App Store、iPodのロゴ、iTunesは、米国および他国のApple Inc.の登録商標です。
iPhone、iPod touch、iPadはApple Inc.の商標です。
iPhone商標は、アイホン株式会社のライセンスに基づき使用されています。
その他、本ブログに記載されている製品名、会社名は、それぞれ各社の商標または登録商標です。