2011-02-04 6 views
0

私は現在UISabitControllerで作業しているので、私は現在UISplitView Controllerで遊んでいます。 いくつかの試行の後、私は最終的に便利な方法を見つけました。唯一の問題は、IBで設定され、うまくリンクされているにもかかわらず、手動で詳細とマスタービューをインスタンス化する必要があることです。ここでUISplitView Interface Builderのnibオブジェクトが割り当てられていません

は、私は私が私MainWindow.xibでUITabBarCOntrollerを初期化し、タブバーの項目を設定し、それを

を行う方法です。

私の最初のタブコントローラは、UISplitViewControllerから継承し、xibで設定されています。ここ はEveritingがXIB年代にフックアップされて

#import "DetailSplitViewController.h" 

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

@implementation DetailSplitViewController 

@synthesize toolbar, popoverController, detailItem, detailDescriptionLabel; 

/* 
When setting the detail item, update the view and dismiss the popover controller if it's showing. 
*/ 
- (void)setDetailItem:(id)newDetailItem { 
if (detailItem != newDetailItem) { 
    [detailItem release]; 
    detailItem = [newDetailItem retain]; 

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

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

- (void)configureView { 
// Update the user interface for the detail item. 
// detailDescriptionLabel.text = [detailItem description]; 
} 

- (void)splitViewController: (UISplitViewController*)svc willHideViewController:(UIViewController *)aViewController withBarButtonItem:(UIBarButtonItem*)barButtonItem forPopoverController: (UIPopoverController*)pc 
{ 
barButtonItem.title = @"Root List"; 
NSMutableArray *items = [[toolbar items] mutableCopy]; 
[items insertObject:barButtonItem atIndex:0]; 
[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 = [[toolbar items] mutableCopy]; 
[items removeObjectAtIndex:0]; 
[toolbar setItems:items animated:YES]; 
[items release]; 
self.popoverController = nil; 
} 


- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation { 
// Overriden to allow any orientation. 
return YES; 
} 


- (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 { 
//[toolbar release]; 
[super dealloc]; 
} 

@end 

私MasterSplitview実装

#import "MasterSplitViewController.h" 


@implementation MasterSplitViewController 


// 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 { 
self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]; 
if (self) { 
    // Custom initialization. 
} 
return self; 
} 
*/ 


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



- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation { 
// Overriden to allow any orientation. 
return YES; 
} 


- (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 { 
[super dealloc]; 
} 


@end 

と私のDetailSplitViewControllerの実装このFirstViewControllerクラスここ

#import "FirstSplitViewController.h" 
#import "MasterSplitViewController.h" 
#import "DetailSplitViewController.h" 


@implementation FirstSplitViewController 

@synthesize detailSplitViewController,masterSplitViewController; 



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

/* 
masterSplitViewController = [[[MasterSplitViewController alloc] initWithNibName:@"MasterSplitViewController" bundle:nil] autorelease]; 
detailSplitViewController = [[[DetailSplitViewController alloc] initWithNibName:@"DetailSplitViewController" bundle:nil] autorelease]; 
*/ 

self.viewControllers = [NSArray arrayWithObjects:masterSplitViewController, detailSplitViewController , nil]; 
self.delegate = detailSplitViewController; 
} 

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation { 
// Overriden to allow any orientation. 
return YES; 
} 


- (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 { 
[super dealloc]; 
} 


@end 

の実装されており、問題I私のFirstSplitViewControllerがxibからロードされたとき、私のマスターとディテールのsplitviewコントローラはそうではありません割り当てられています(IBでリンクされています)。私はそれらを手動でALLOC場合は、すべてが(私のFirstSplitViewController.mで以下のコメントを解除アロケーションのinit線)

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

/* 
masterSplitViewController = [[[MasterSplitViewController alloc] initWithNibName:@"MasterSplitViewController" bundle:nil] autorelease]; 
detailSplitViewController = [[[DetailSplitViewController alloc] initWithNibName:@"DetailSplitViewController" bundle:nil] autorelease]; 
*/ 

self.viewControllers = [NSArray arrayWithObjects:masterSplitViewController, detailSplitViewController , nil]; 
self.delegate = detailSplitViewController; 

} 

だから、私の質問はXIBである場合は、それらのオブジェクトがロードare't理由で魔法のように動作しますか?これは実際に私が手動でこれを行う必要があります初めてです。たぶん私は何かが欠けているでしょう。私はちょうどこれと同じ現象(と思う)間で実行したすべての回答やアドバイス

S-マート

答えて

1

ため

感謝。インタフェースビルダー/コントローラの階層構造/ビュー階層がiOSで動作する方法を完全に理解し始めたところです。 IBOutlet経由でリンクされているメンバ変数は、コントローラインスタンスにアクセスするまで初期化されていないようです。私のコードは、このようにした:

if(self.sectionOneViewController == nil) 
{ 
    SectionOneViewController *sectionOneView = [[SectionOneViewController alloc] 
         initWithNibName:@"SectionOne" 
         bundle:[NSBundle mainBundle]]; 
    self.sectionOneViewController = sectionOneView; 

    [sectionOneView release]; 
    //[self showSectionOne:sender]; 
} 

    [self.navigationController pushViewController:self.sectionOneViewController animated:YES]; 

[[UIApplication sharedApplication].keyWindow addSubview:self.sectionOneViewController.sectionOneTabController.view]; 

私は最後の2行の位置を入れ替えた場合、私はビューを再訪しない限り、それはsectionOneTabControllerのためにNULLポインタを持っているでしょう。 .xib参照にアクセスする前に、あなたのビューを追加するコントローラが必要だと思います。

+0

多くのおかげで、あなたの答えをよく見直して申し訳ありません。あなたがアクセス可能になる前に、xib参照がロードするビューを必要としているようです。 – arex

関連する問題