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



2011年10月11日

UISplitViewにUINavigationController を実装する その1



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];
UINavigationController* navigationControllerLeft = [[UINavigationController alloc] initWithRootViewController:rootViewController];

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

rootViewController.detailViewController = detailViewController;

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

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

※ポイント
・navigationControllerLeftをrootViewControllerで初期化することにより、左ペインにUINavigationControllerを設定する。
・splitViewController.viewControllersに、左ペイン(UINavigationControllerを設定したViewController(rootViewController))、右ペイン(detailViewController)を設定する。NSArrayに設定する順序は上記の通りとすること。入れ替えると表示が崩れるので注意。


(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;

@interface DetailViewController : UIViewController <UIPopoverControllerDelegate, UISplitViewControllerDelegate>

@property (nonatomic, retain) IBOutlet UIToolbar *toolbar;

@property (nonatomic, retain) NSString *detailItem;

@property (nonatomic, retain) IBOutlet UILabel *detailDescriptionLabel;

@property (nonatomic, assign) IBOutlet RootViewController *rootViewController;

@end



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

#import "RootViewController.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.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;
}

/*
// 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];
}

※ポイント
・DetailViewControllerはテンプレート生成時から基本的に変更なし。
・左ペイン(rootViewController)から呼び出されると、セッターであるsetDetailItemが実行される。


(7) DetailView.xib
DetailViewControllerのxibには、画面上部にToolBarを設置し、DetailViewController.hのIBoutletと接続しておくこと。
テンプレートから作成した場合は、あらかじめToolBarは作成されている。
タグ:IOS iPAD
posted by mobileDeveloper at 13:15 | Comment(0) | TrackBack(0) | UISplitView はてなブックマーク - UISplitViewにUINavigationController を実装する その1 | このブログの読者になる | 更新情報をチェックする
この記事へのコメント
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント:

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


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

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