2011-02-04 3 views
0

Je suis en train de jouer avec UISplitView Controller car il faut que certains d'entre eux travaillent dans un UITabBarController. Après quelques essais, j'ai finalement trouvé un moyen pratique de le faire, le seul problème que je reçois est que je dois manuellement instancié mes détails et ma vue maître bien qu'ils soient configurés dans IB et bien liés.Les objets nib d'UISplitView Interface Builder ne sont pas attribués

Voici comment je le fais

J'initialize un UITabBarController dans mon MainWindow.xib et définissez les éléments TabBar.

Mon premier contrôleur d'onglet hérite de UISplitViewController et est configuré avec un xib. Voici la mise en œuvre de cette classe 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 

Voici ma MasterSplitview mise en œuvre

#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 

et ma mise en œuvre de DetailSplitViewController

#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 

Everiting est accroché dans les années xib, et le problème que je get est que lorsque mon FirstSplitViewController est chargé à partir de son xib, mes contrôleurs splitview maître et détail ne sont pas alloués (ils sont liés dans IB). Si je les alloc, tout fonctionne manuellement comme un charme (lignes init décommenter alloc ci-dessous dans mon FirstSplitViewController.m)

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

} 

Alors ma question est pourquoi ces objets are't chargés lorsque le xib est? C'est vraiment la première fois que je dois le faire manuellement. Peut-être qu'il me manque quelque chose.

Merci pour toutes les réponses ou des conseils

s-mart

Répondre

1

J'ai couru juste en face de ce même phénomène (je pense). Je commence tout juste à comprendre la façon dont fonctionne Interface Builder/contrôleur heirarchy/view heirarchy pour iOS. Il semble que les variables membres qui sont liées via IBOutlet ne soient pas initialisées tant que l'accès à l'instance du contrôleur n'a pas été effectué. Mon code est ainsi:

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

si je troqué l'emplacement des 2 dernières lignes, il aurait un pointeur nul pour le moins que je sectionOneTabController revisité la vue. Je pense qu'avoir un contrôleur ajouter votre vue est nécessaire avant que les références de .xib puissent être accédées.

+0

Un grand merci et désolé pour le long temps d'examiner votre réponse. Il semble que vous ayez dit que les références xib nécessitent que la vue soit chargée avant d'être accessible. – arex

Questions connexes