2012-01-01 2 views
3

Je cherche désespérément depuis 2h maintenant à trouver un bug dans mon code, qui est responsable de ne pas montrer mon SplitViewController que j'ai implémenté. La chose étrange est, qu'aucune erreur de compilation n'est montrée et que tous les liens et dépendances semblent être corrects.SplitViewController n'est pas affiché

Rien ne s'affiche à l'écran lors du premier chargement. Mais quand je tourne l'appareil, je vois la vue correcte. Mais lors de la mise à feu, il n'y a pas de vue du tout, même si toutes les vues sont connectées. Je viens d'en avoir une partie ... J'ai découvert avec le débogueur que le premier contrôleur de vue n'est pas chargé au démarrage. Donc, le tableau des contrôleurs de vue pour la vue éclatée n'est pas rempli avec un contrôleur de vue initial ... comment puis-je résoudre ce problème?

La première partie que j'ai vérifié était mon AppDelegate:

#import "AppDelegate.h" 
#import "RootViewController.h" 

@implementation AppDelegate 

@synthesize window = _window; 
@synthesize splitViewController = _splitViewController; 

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
{ 
    NSLog(@"%s %d", __PRETTY_FUNCTION__, __LINE__); 
    [[self window] addSubview:self.splitViewController.view]; 
    [self.window makeKeyAndVisible]; 

    return YES; 
} 



@end 

Le premier contrôleur Voir

#import "FirstViewController.h" 

@implementation FirstViewController 
@synthesize toolbar; 


#pragma mark - 
#pragma mark View Lifecycle 

- (void)viewDidUnload 
{ 
    [super viewDidUnload]; 
    self.toolbar = nil; 
} 


#pragma mark - 
#pragma mark Managing the Popover 

- (void)showRootPopoverButtonItem:(UIBarButtonItem *)barButtonItem 
{ 
    NSMutableArray *itemsArray = [toolbar.items mutableCopy]; 
    [itemsArray insertObject:barButtonItem atIndex:0]; 
    [toolbar setItems:itemsArray animated:NO]; 
} 

- (void)invalidateRootPopoverButtonItem:(UIBarButtonItem *)barButtonItem 
{ 
    NSMutableArray *itemsArray = [toolbar.items mutableCopy]; 
    [itemsArray removeObject:barButtonItem]; 
    [toolbar setItems:itemsArray animated:NO]; 
} 

#pragma mark - 
#pragma mark Rotation support 

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation { 
    return YES; 
} 


@end 

La deuxième partie que j'ai vérifié était mon RootViewController. Le fait est que lorsque vous cliquez sur une entrée tableView, un nouveau contrôleur de vue doit être chargé et affiché. Donc, je n'instancie pas les VCs dans mon application Delegate mais dans la méthode déléguée "do select row".

C'est le RootViewController:

#import "RootViewController.h" 
#import "FirstViewController.h" 
#import "SecondViewController.h" 

@implementation RootViewController 
@synthesize popoverController, splitViewController, rootPopoverButtonItem; 


#pragma mark - 
#pragma mark View Lifecycle 

- (void)viewDidLoad 
{ 
    NSLog(@"%s %d", __PRETTY_FUNCTION__, __LINE__); 
    [super viewDidLoad]; 
    self.contentSizeForViewInPopover = CGSizeMake(310.0, self.tableView.rowHeight * 2.0); 
} 

- (void)viewDidUnload 
{ 
    NSLog(@"%s %d", __PRETTY_FUNCTION__, __LINE__); 
    [super viewDidUnload]; 
    self.splitViewController = nil; 
    self.rootPopoverButtonItem = nil; 
} 


#pragma mark - 
#pragma mark Rotation support 

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation 
{ 
    NSLog(@"%s %d", __PRETTY_FUNCTION__, __LINE__); 
    return YES; 
} 


#pragma mark - 
#pragma mark SplitViewController delegates 

- (void)splitViewController:(UISplitViewController *)svc willHideViewController:(UIViewController *)aViewController withBarButtonItem:(UIBarButtonItem *)barButtonItem forPopoverController:(UIPopoverController *)pc 
{ 
    NSLog(@"%s %d", __PRETTY_FUNCTION__, __LINE__); 
    barButtonItem.title = @"PolyCube Prototypes"; 

    self.popoverController = pc; 
    self.rootPopoverButtonItem = barButtonItem; 

    UIViewController <SubstitutableDetailViewController> *detailViewController = [splitViewController.viewControllers objectAtIndex:1]; 
    [detailViewController showRootPopoverButtonItem:rootPopoverButtonItem]; 
} 

- (void)splitViewController:(UISplitViewController *)svc willShowViewController:(UIViewController *)aViewController invalidatingBarButtonItem:(UIBarButtonItem *)barButtonItem 
{ 
    NSLog(@"%s %d", __PRETTY_FUNCTION__, __LINE__); 
    self.popoverController = nil; 
    self.rootPopoverButtonItem = nil; 

    UIViewController <SubstitutableDetailViewController> *detailViewController = [splitViewController.viewControllers objectAtIndex:1]; 
    [detailViewController invalidateRootPopoverButtonItem:rootPopoverButtonItem]; 
} 



#pragma mark - 
#pragma mark Table View Data Source 

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section 
{ 
    NSLog(@"%s %d", __PRETTY_FUNCTION__, __LINE__); 
    return 2; 
} 

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    NSLog(@"%s %d", __PRETTY_FUNCTION__, __LINE__); 
    static NSString *CellIdentifier = @"RootViewControllerIdentifier"; 

    UITableViewCell *cell = [self.tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 

    if (cell == nil) { 
     cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier]; 
    } 

    if (indexPath.row == 0) { 
     cell.textLabel.text = @"PolyCube 1"; 
    } 
    else { 
     cell.textLabel.text = @"PolyCube 2"; 
    } 

    return cell; 
} 


#pragma mark - 
#pragma mark - Table View Selection 

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    NSLog(@"%s %d", __PRETTY_FUNCTION__, __LINE__); 
    NSUInteger row = indexPath.row; 

    UIViewController <SubstitutableDetailViewController> *detailViewController = nil; 

    if (row == 0) { 
     FirstViewController *newDetailViewController = [[FirstViewController alloc] initWithNibName:@"FirstDetailView" bundle:nil]; 
     detailViewController = newDetailViewController; 
    } 


    if (row == 1) { 
     SecondViewController *newDetailViewController = [[SecondViewController alloc] initWithNibName:@"SecondDetailView" bundle:nil]; 
     detailViewController = newDetailViewController; 
    } 


    NSArray *vcs = [[NSArray alloc] initWithObjects:self.navigationController, detailViewController, nil]; 
    splitViewController.viewControllers = vcs; 

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

    if (rootPopoverButtonItem != nil) { 
     [detailViewController showRootPopoverButtonItem:self.rootPopoverButtonItem]; 
    } 
} 

@end 

J'apprécierais vraiment un coup de main ... Je ne sais pas où chercher plus. J'ai même vérifié toutes les connexions IB ... rien à redire je pense. Mais toujours seulement un écran blanc.

Merci beaucoup Sebastian

+0

Est-ce que vous chargez un fichier NIB quelque part? – craig1231

+0

Eh bien, je pense que ... je viens de découvrir, que le tableau splitviewcontroller.viewcontrollers n'est pas rempli initialement lorsqu'il est chargé .... comment puis-je résoudre ce problème? Comme vous pouvez le voir, je mets à jour ce tableau, quand je clique sur une entrée de tableview. mais j'ai connecté le tableau tout en déboguant pour montrer les objets dans un NSLog .... et il y avait le message: NULL Donc je pense qu'il devrait y avoir une possibilité d'initialiser ce tableau avec "navcontroller et firstviewcontroller" ... Mais je Je ne sais pas comment – konturgestaltung

Répondre

0

Ce comportement est attendu. Si vous ne définissez pas le délégué de UISplitViewController, la vue principale ne sera pas visible en mode portrait. Votre vue principale n'est jamais chargée et l'écran blanc que vous voyez là est votre vue détaillée.

Donc, vous devez implémenter votre propre UISplitViewController (créer un nouveau UIViewController et changer à UISplitViewControlle. Ne pas oublier de lui attribuer dans le storyboard à votre point de vue partagé)

également dans l'interface, faire mettre en œuvre et dans la méthode viewDidLoad pour définir le délégué sur self.

Ce protocole indique où placer la table principale. Voulez-vous comme en mode split, en divisant la fenêtre? Ou peut-être vous voulez un bouton quelque part (généralement dans une barre d'onglets) et quand vous appuyez sur la fenêtre principale fenêtre pop-ups?

Par exemple, mettre en œuvre ce type d'avoir la vue maître toujours visible:

INTERFACE:

#import <UIKit/UIKit.h> 

@interface SplitViewController : UISplitViewController <UISplitViewControllerDelegate> 

@end 

MISE EN ŒUVRE

#import "SplitViewController.h" 

@interface SplitViewController() 

@end 

@implementation SplitViewController 


- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    [self setDelegate:self]; 
} 

- (void)viewDidUnload 
{ 
    [super viewDidUnload]; 
    // Release any retained subviews of the main view. 
} 

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation 
{ 
    return YES; 
} 

-(BOOL)splitViewController:(UISplitViewController *)svc shouldHideViewController:(UIViewController *)vc inOrientation:(UIInterfaceOrientation)orientation{ 
    return NO; 
} 


@end 

Si vous ne vous sentez pas comme la mise en œuvre de votre propre UISplitViewController juste pour gérer le délégué, vous pouvez également faire en sorte que l'un de vos contrôleurs maître ou de détail l'implémente et l'assigne dans le storyboard (essayez ctrl et faites glisser à partir de la vue partagée vers n'importe lequel de votre contrôleur et en le définissant comme délégué, n'oubliez pas d'implémenter le protocole en premier)