左側にドリルダウン テーブルがある iPad 用の分割ビュー コントローラーがあります。問題なくドリルダウンを使用してテーブルにデータを入力できますが、左側の UITableView 内でクリックしたアイテムを取得して、右側の detailDescriptionLabel に表示できないようです。
ProductViewController.m に次のコードがあります。
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
[tableView deselectRowAtIndexPath:indexPath animated:YES];
NSLog(@"Row clicked: %i", indexPath.row);
if (_delegate != nil) {
Product *product = (Product *) [_products objectAtIndex:indexPath.row];
[_delegate productSelectionChanged:product];
}
DetailedVC *detailView = [[DetailedVC alloc] initWithNibName:@"DetailedVC" bundle:[NSBundle mainBundle]];
NSLog(@"User clicked on: %@", [NSString stringWithFormat:@"%d",indexPath.row]);
detailView.detailDescriptionLabel.text = [NSString stringWithFormat:@"%d",indexPath.row];
[self.navigationController pushViewController:detailView animated:YES];
}
ここで何が起こるかというと、テーブル ビューがある左側に DetailedVC をプッシュし、右側の詳細ビューでクリックされた行が更新されたことを確認することです。特定のインデックスをクリックしたことをログ ウィンドウで確認できるので、クリック イベントをキャプチャして値を取得していることがわかります。
DetailedVC.m 内には、このラベルを更新する次のコードがあります。
- (void)viewDidLoad
{
[super viewDidLoad];
[self configureView];
}
- (void) configureView {
if (self.detailItem) {
self.detailDescriptionLabel.text = [self.detailItem description];
NSLog(@"Item: %@", [self.detailItem description]);
}
}
viewDidLoad を編集すると、[self.detailItem の説明] に (null) が返されます。
- (void)viewDidLoad
{
[super viewDidLoad];
NSLog(@"Detail description label: %@", [self.detailItem description]);
}
ProductViewController.h
@interface ProductViewController : UIViewController <UITableViewDataSource, UITableViewDelegate> {
NSMutableArray *_products;
UITableView *_productsTableView;
id<ProductSelectionDelegate> _delegate;
}
@property (nonatomic, strong) IBOutlet UITableView *productsTableView;
@property (nonatomic, retain) NSMutableArray *products;
@property (nonatomic, assign) id<ProductSelectionDelegate> delegate;
@end
AppDelegate.h
@class ProductViewController;
@class DetailedVC;
@interface TabAndSplitAppAppDelegate : NSObject <UIApplicationDelegate, UITabBarControllerDelegate> {
UIWindow *window;
UITabBarController *tabBarController;
ProductViewController *_productViewController;
DetailedVC *_detailedViewController;
}
@property (nonatomic, retain) IBOutlet UIWindow *window;
@property (nonatomic, retain) IBOutlet UITabBarController *tabBarController;
@property (nonatomic, retain) IBOutlet ProductViewController *productViewController;
@property (nonatomic, retain) IBOutlet DetailedVC *detailedViewController;
@end
AppDelegate.m
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
NSMutableArray *products = [NSMutableArray array];
[products addObject:[[Product alloc] initWithName:@"Product 1 Name" desc:@"Product 1 Description"]];
_detailedViewController.product = [products objectAtIndex:0];
// Override point for customization after app launch.
//create split view controller
RootVC *rvc=[[RootVC alloc] init];
rvc.title=@"Root VC";
DetailedVC *dvc=[[DetailedVC alloc] init];
dvc.title=@"Detailed VC";
_productViewController.delegate = _detailedViewController;
MySplitViewController *msc = [[MySplitViewController alloc] initwithLeftVC:rvc rightVC:dvc];
msc.title=@"First";
//create a temporary VC to show in second tab
SecondViewController *vc2 = [[SecondViewController alloc] init];
vc2.title=@"Second";
//make an array containing these two view controllers
NSArray *viewControllers = [NSArray arrayWithObjects:msc,vc2,nil];
[tabBarController setViewControllers:viewControllers];
tabBarController.view.backgroundColor=[UIColor blackColor];
for(UITabBarItem*t in tabBarController.tabBar.items)
{
t.image=[UIImage imageNamed:@"icon.png"];
t.badgeValue=[NSString stringWithFormat:@"%d",([tabBarController.tabBar.items indexOfObject:t]+1)];
}
//the views are retained their new owners, so we can release
[rvc release];
[dvc release];
[msc release];
[vc2 release];
// Add the tab bar controller's current view as a subview of the window
[self.window addSubview:tabBarController.view];
[self.window makeKeyAndVisible];
return YES;
}
MySplitViewController.h
#import <UIKit/UIKit.h>
@interface MySplitViewController : UIViewController
{
UINavigationController *leftController;
UINavigationController *rightController;
}
@property (nonatomic, retain) UINavigationController *leftController;
@property (nonatomic, retain) UINavigationController *rightController;
- (void)layoutViews:(UIInterfaceOrientation)orientation initialVerticalOffset:(float)offset;
- (MySplitViewController*) initwithLeftVC:(UIViewController*)leftvc rightVC:(UIViewController*)rightvc;
@end
MySplitViewController.m
- (MySplitViewController*) initwithLeftVC:(UIViewController*)leftvc rightVC:(UIViewController*)rightvc
{
if(self=[super init])
{
UINavigationController *lnc=[[UINavigationController alloc] initWithRootViewController:leftvc];
lnc.navigationBarHidden=NO;
self.leftController=lnc;
[lnc release];
UINavigationController *rnc=[[UINavigationController alloc] initWithRootViewController:rightvc];
rnc.navigationBarHidden=NO;
self.rightController=rnc;
[rnc release];
}
return self;
}
製品.h
#import <Foundation/Foundation.h>
@interface Product : NSObject {
NSString *_productID;
NSString *_productDescription;
}
@property (nonatomic, copy) NSString *productID;
@property (nonatomic, copy) NSString *productDescription;
- (Product *)initWithName:(NSString *)productID desc:(NSString *)productDescription;
@end
Product.m
#import "Product.h"
@implementation Product
@synthesize productID = _productID;
@synthesize productDescription = _productDescription;
- (Product *)initWithName:(NSString *)productID desc:(NSString *)productDescription {
if ((self = [super init])) {
self.productID = productID;
self.productDescription = productDescription;
}
return self;
}
@end