2009-07-22 4 views
1

Je fais sûrement quelque chose de complètement stupide ici, j'espère que quelqu'un peut me dire quoi! En résumé, je voudrais basculer par programmation une sous-vue quand un bouton (je vais utiliser un bouton segmenté) est cliqué. Il n'a pas besoin d'animer. Idéalement, je chargerais le contenu de ces vues à partir d'une plume.Comment configurer la sous-vue de UIView dynamiquement (iPhone)?

Je pousse une sous-classe UIViewController, initialisée à partir d'une plume, sur un contrôleur de navigation. Ce contrôleur de vue & est l'affichage de la vue "par défaut" ok. Cette plume contient:

File's Owner [Class=my view controller subclass] 
First Responder 
View 
--Bar Segmented Control 
--View //this is the 'subview' whose content I want to toggle 

Peut-être que j'ai fait une erreur avec mes prises IB? Ils sont accrochés comme suit:

switchableView <--> View 
view <--> View 

Et où switchableView est déclaré:

IBOutlet UIView *switchableView; 
... 
@property (nonatomic, retain) UIView *switchableView; 

Je suis coincé à remplacer le contenu de ce UIView. Tout d'abord, je veux juste mettre à un défaut lorsque la vue prend vie. Une fois que je l'ai, permuter avec quelque chose d'autre devrait être facile car je peux déjà capturer l'événement généré par le bouton segmenté. Quelqu'un peut-il me dire ce que je fais de mal?

- (void)loadView { 
NSLog(@"loadView invoked"); 
[super loadView]; 
UIView *view = [[UIView alloc] init]; 
UILabel *label = [[UILabel alloc] init]; 
label.text = @"Segment1"; 
[view addSubview:label]; 
[switchableView addSubview:view]; //this is what I can't work out 
[view release]; 
[label release];  
} 

Cette méthode est invoquée (comme viewDidLoad), mais ni aide. Je suppose que je fais [switchableView addSubview:view] faux. J'ai également essayé switchableView = view, mais une longue période dans la sécurité de Java et Perl ne me rend pas sûr à 100% si c'est juste d'essayer ou non!

En espérant que quelqu'un puisse me redresser. Merci à l'avance,

Paul

Répondre

3

résolu ce problème à la fin après avoir inspecté l'exemple de code UICatalog (merci à vous deux pour me donner quelques conseils). Les travaux suivants:

- (void)loadView { 
    [super loadView]; 

    //define what will go in the seg1 view 
    UILabel *mylabel = [[UILabel alloc] initWithFrame:switchableView.frame]; 
    [email protected]"finally"; 
    self.seg1view = [[[UIView alloc] initWithFrame:switchableView.frame] autorelease]; 
    [self.seg1view addSubview:mylabel]; 
    [mylabel release]; 

    //define what will go in the seg2 view 
    UILabel *mylabel2 = [[UILabel alloc] initWithFrame:switchableView.frame]; 
    [email protected]"it works!"; 
    self.seg2view = [[[UIView alloc] initWithFrame:switchableView.frame] autorelease]; 
    [self.seg2view addSubview:mylabel2]; 
    [mylabel2 release]; 

    //default the switchable view to seg1view 
    [switchableView addSubview:self.seg1view]; 
} 

-(void)doTheSwitch { 
    if (segmentedButton.selectedSegmentIndex == 0) { 
     [seg2view removeFromSuperview]; 
     [switchableView addSubview:seg1view]; 
    } 
    if (segmentedButton.selectedSegmentIndex == 1) {  
     [seg1view removeFromSuperview]; 
     [switchableView addSubview:seg2view]; 
    } 
} 

où les éléments suivants sont également définis comme des propriétés (conserver)

non atomiques
IBOutlet UIView *switchableView; 
UIView *seg1view; 
UIView *seg2view; 
+0

Juste pour info: "Votre implémentation personnalisée de cette méthode ne devrait pas appeler super." http://developer.apple.com/library/ios/documentation/uikit/reference/UIViewController_Class/Reference/Reference.html#//apple_ref/occ/instm/UIViewController/loadView –

0

Voici quelques extraits pour vous aider. La première est simplement l'initialisation d'un contrôleur de navigation

// In AppDelegate.m 
-(void)applicationDidFinishLaunching:(UIApplication *)application 
{ 
    // Create and configure the main view controller. 
    UIViewController *firstViewController = [[UIViewController alloc] init]; 

    // Add create and configure the navigation controller. 
    UINavigationController *navigationController = [[UINavigationController alloc] initWithRootViewController:firstViewController]; 
    self.navController = navigationController; 
    [navigationController release]; 

    // Configure and display the window. 
    [window addSubview:navController.view]; 
    [window makeKeyAndVisible]; 
} 

Ensuite, lorsque vous êtes prêt pour une nouvelle vue, il suffit de pousser un là-bas.

// Wherever you need to get your new view on there 
UIViewController *secondViewController = [[UIViewController alloc] init]; 
[[self navigationController] pushViewController:secondViewController animated:YES]; 
[secondViewController release]; 

Vous devriez vraiment passer par environ 5 d'Apple Exemples de projets par jour pour vraiment parler couramment dans le monde de l'iPhone. Découvrez celui-ci pour les débutants: .

+0

Cheers, mais ce n'est pas ce que je suis après. J'ai déjà un contrôleur de vue, et il affiche déjà ma vue - je ne veux pas pousser un nouveau contrôleur de vue sur la pile. Ce que je veux faire est d'utiliser ce contrôleur de vue pour échanger une sous-vue qui est intégrée dans ma vue. –

0

Le problème le plus probable est que vous ne définissez pas le cadre sur vos vues, ce qui signifie que même si elles sont correctement attachées, elles ont la taille 0x0.

Essayez quelque chose comme:

- (void)loadView { 
    NSLog(@"loadView invoked"); 
    [super loadView]; 

    CGRect labelFrame = CGRectZero; 
    labelFrame.size.height = switchableView.size.height; 
    labelFrame.size.width = switchableView.size.width; 

    UILabel *label = [[UILabel alloc] initWithFrame:labelFrame]; 
    label.text = @"Segment1"; 
    [switchableView addSubview:label]; //this is what I can't work out 
    [label release];  
} 

Voir aussi supprimée car elle était gratuite (un UILabel est un UIView, vous empilaient trois point de vue, dont 2 ont rien qu'un seul sous-vue qui couvre son plein cadre.) et il a élidé la propriété de vue UIViewController (en général il est mauvais de faire des variables locales avec le même nom que les variables d'instance ou les propriétés, il y a des avertissements du compilateur que vous pouvez activer pour éviter cela).

0

Si je comprends bien votre question, vous essayez d'échanger une vue avec une autre.Une façon d'accomplir ceci est la suivante:

Ajoutez un UIView à la vue racine nommée switchView. Que ce soit en code ou dans Interface Builder créer un nouveau UIView nommé subView1 et l'ajouter comme une sous-classe de SWITCHVIEW lorsque la vue racine des charges:

[switchView addSubview:subView1];

Lorsque l'utilisateur active ou désactive le contrôle segmenté dans la vue racine, créer une nouvelle UIView de la même manière nommée subView2 et passer avec la sous-vue actuel de SWITCHVIEW:

[subView1 removeFromSuperview]; 
[switchView addSubview:subView2];
Questions connexes