これに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は作成されている。
【UISplitViewの最新記事】