0

Je construis un contrôle segmenté au sein de ma méthode de viewDidLoad, comme ceci:Comment supprimer segmentedcontroller de uinavigationcontroller après l'affichage de pops?

NSArray *tabitems = [NSArray arrayWithObjects:@"ONE", @"TWO", nil]; 
UISegmentedControl *tabs = [[UISegmentedControl alloc] initWithItems:tabitems]; 
tabs.segmentedControlStyle = UISegmentedControlStyleBar; 
tabs.frame = CGRectMake(185.0, 7.0, 130.0, 30.0); 
tabs.selectedSegmentIndex = 0; 
[self.navigationController.navigationBar addSubview:tabs]; 
[tabs release]; 

Mais lorsque l'utilisateur est réinvestit dans la hiérarchie UINavigationController, le contrôleur reste segmenté sur la barre de navigation. Comment pourrais-je m'en débarrasser? Ou est-ce que je fais quelque chose de fondamentalement faux?


EDIT

Après les suggestions d'Alex, je propertized onglets et essayé:

NSArray *tabItems = [NSArray arrayWithObjects:@"FAQs", @"Terms", nil]; 
    self.tabs = [[UISegmentedControl alloc] initWithItems:tabItems]; 

mais je ne suis pas sûr que c'est une bonne idée de Alloc une propriété;

Et j'utilise

[self.tabs removeFromSuperview]; 

dans mon viewWillDisappear. Est-ce suffisant?

Répondre

2

Conservez une référence au contrôle segmenté dans votre contrôleur de vue (par exemple, définissez tabs comme propriété dans le fichier d'en-tête du contrôleur de vue). Remplacez la méthode -viewWillDisappear: du contrôleur de vue et supprimez le contrôle segmenté de la barre de navigation à l'aide de la méthode -removeFromSuperview du contrôle.

EDIT

vous auriez encore alloc-init votre contrôle segmentée tabs dans -viewDidLoad. Vous devez juste définir une propriété retain pour tabs dans l'en-tête de votre contrôleur de vue et déplacer l'instruction release du contrôle vers la méthode dealloc du contrôleur de vue.

Lisez la section "Propriétés" de ce Objective-C tutorial pour une introduction aux propriétés et comment les configurer.

La façon de passer outre une méthode est la suivante:

- (ReturnClass) methodNameToOverride:args { 
    [super methodNameToOverride:args]; 
    // your code goes here... 
} 

Dans le cas de -viewWillDisappear:, cette méthode est appelée lorsque votre contrôleur de vue est sur le point de disparaître, comme quand il est sauté de la pile de navigation . Ceci est un excellent endroit pour mettre le code qui gère le nettoyage des éléments spécifiques à vue-contrôleur, comme votre commande segmentée:

- (void) viewWillDisappear:(BOOL)animated { 
    [super viewWillDisappear:animated]; 
    [tabs removeFromSuperview]; 
} 

EDIT 2

Si votre propriété est définie comme suit:

@property (nonatomic, retain) UISegmentedControl *tabs; 

alors vous allez retain tout ce que vous définissez self.tabs égal.

Votre code ici:

self.tabs = [[UISegmentedControl alloc] initWithItems:...]; 

va créer une fuite de mémoire, parce que vous êtes en conservant cet objet: [[UISegmentedControl alloc] init] - mais vous ne relâchez se [[UISegmentedControl alloc] init]. C'est mauvais.

Au lieu de cela, utilisez autorelease sur le côté droit, i.e. .:

self.tabs = [[[UISegmentedControl alloc] initWithItems:...] autorelease]; 

La propriété tabs conserve sa propre référence au contrôle initialisé segmentée. Ce contrôle segmenté initialisé est lui-même libéré correctement à un moment ultérieur. Donc plus de fuite de mémoire.

+0

Merci. comment pourrais-je configurer le contrôle segmenté sans alloc/init-it? Et pouvez-vous me donner la ligne de code requise dans la méthode viewWillDisappear. Merci – cannyboy

+0

changé orig question – cannyboy

+0

S'il vous plaît voir les modifications. –

0

Mieux encore, définissez le paramètre navigationItem.titleView du UISegmentedControl associé à UIViewController sur UISegmentedControl.

-(void) viewDidLoad { 
    if(!mySegmentedControl) { 
     // initialize the UISegmentedControl 
     ... 
    } 

    self.navigationItem.titleView = mySegmentedControl; 
} 

Pas retrait manuel du UISegmentedControl ou tout autre UIView ailleurs nécessaire, sauf, bien sûr, quand la libération est dealloc'ed UIViewController possédant certains. En outre, pour être un «bon citoyen de mémoire», vous pouvez définir votre propriété à zéro dans -viewDidUnload.

Vous pouvez également personnaliser les éléments barButtonItems gauche et droit du navgiationItem de UIViewController.