2011-06-15 1 views
1

J'ai un problème assez drôle qui implique loadView, viewDidLoad, viewWillAppear et l'état d'un ivar. J'ai une application basée sur la navigation. Et à partir de ma première vue de niveau j'ai une liste de table et puis je clique sur une des cellules cela m'amènera à la deuxième vue de niveau (vue de détail). Lorsque je clique sur une cellule, j'ajoute aussi un objet "Office" (qui contient des chaînes comme streetAddress et boxAddress) au contrôleur de vue qui est poussé. Je puis remplir la vue détaillée avec le contenu de l'objet Office comme [box setText:[self.office boxAddress]]; (boîte est un UILabel). Maintenant, ce que je veux réaliser ici est que parfois la valeur de chaîne de boxAddress est vide et dans ces cas je ne veux pas ajouter une chaîne vide à UILabel, à la place je veux déplacer le prochain UILabel (et prendre la place du boxAddress). Donc, j'ai fait un contrôle conditionnel pour voir si boxAddress est vide si c'est il devrait mettre en place UILabel s avec des coordonnées spécifiques et s'il n'est pas vide, il devrait mettre en place UILabel s avec d'autres coordonnées spécifiques.iOS construire vue par programme en fonction de l'objet ivar

Je comprends que vous devez utiliser viewWillAppear si vous voulez que le code soit exécuté chaque fois que la vue est chargée. Mais pour une raison quelconque, il semble que viewWillAppear est seulement couru quand la chaîne boxAddress est vide. Et si je clique sur une cellule qui a un vide boxAddress il utilisera la valeur de boxAddress de la dernière cellule que j'ai cliquée qui avait un boxAddress non-vide.

Je vais coller mon code ici pour voir si vous pouvez me donner un pointeur sur ce que je fais mal ici.

// Implement loadView to create a view hierarchy programmatically, 
// without using a nib. 
- (void)loadView { 

    //allocate the view 
    self.view = [[UIView alloc] initWithFrame:[[UIScreen mainScreen] applicationFrame]]; 

    //set the view's background color 
    self.view.backgroundColor = [UIColor whiteColor]; 
} 

- (void)viewDidLoad 
{ 

    //add the labels 
    name = [[UILabel alloc] initWithFrame:CGRectMake(10.0,10.0,320.0,20.0)]; 
    [name setBackgroundColor:[UIColor clearColor]]; 
    [name setTextColor:[UIColor blackColor]]; 

    street = [[UILabel alloc] initWithFrame:CGRectMake(10.0,30.0,320.0,20.0)]; 
    [street setBackgroundColor:[UIColor clearColor]]; 
    [street setTextColor:[UIColor blackColor]]; 

    //if no box address, move up the rest of the addresses 
    if ([[self.office boxAddress] length] == 0) { 

     zip = [[UILabel alloc] initWithFrame:CGRectMake(10.0,50.0,320.0,20.0)]; 
     [zip setBackgroundColor:[UIColor clearColor]]; 
     [zip setTextColor:[UIColor blackColor]]; 

     phone = [[UILabel alloc] initWithFrame:CGRectMake(10.0,70.0,320.0,20.0)]; 
     [phone setBackgroundColor:[UIColor clearColor]]; 
     [phone setTextColor:[UIColor blackColor]]; 

     fax = [[UILabel alloc] initWithFrame:CGRectMake(10.0,90.0,320.0,20.0)]; 
     [fax setBackgroundColor:[UIColor clearColor]]; 
     [fax setTextColor:[UIColor blackColor]]; 

     [self.view addSubview:name]; 
     [self.view addSubview:street]; 
     [self.view addSubview:zip]; 
     [self.view addSubview:phone]; 
     [self.view addSubview:fax]; 

    } else { 

     box = [[UILabel alloc] initWithFrame:CGRectMake(10.0,50.0,320.0,20.0)]; 
     [box setBackgroundColor:[UIColor clearColor]]; 
     [box setTextColor:[UIColor blackColor]]; 

     zip = [[UILabel alloc] initWithFrame:CGRectMake(10.0,70.0,320.0,20.0)]; 
     [zip setBackgroundColor:[UIColor clearColor]]; 
     [zip setTextColor:[UIColor blackColor]]; 

     phone = [[UILabel alloc] initWithFrame:CGRectMake(10.0,90.0,320.0,20.0)]; 
     [phone setBackgroundColor:[UIColor clearColor]]; 
     [phone setTextColor:[UIColor blackColor]]; 

     fax = [[UILabel alloc] initWithFrame:CGRectMake(10.0,110.0,320.0,20.0)]; 
     [fax setBackgroundColor:[UIColor clearColor]]; 
     [fax setTextColor:[UIColor blackColor]]; 

     [self.view addSubview:name]; 
     [self.view addSubview:street]; 
     [self.view addSubview:box]; 
     [self.view addSubview:zip]; 
     [self.view addSubview:phone]; 
     [self.view addSubview:fax]; 
    } 

    [super viewDidLoad]; 
    // Do any additional setup after loading the view from its nib. 
} 

// viewWillAppear method is run every time the view is loaded as opposite to the viewDidLoad method which only is run once 
// in this program DisclosureDetail view needs to be loaded for each detail view with different content each time 
- (void)viewWillAppear:(BOOL)animated { 

    NSLog(@"%@", [self.office boxAddress]); 

    [name setText:[self.office name]]; 
    [street setText:[self.office streetAddress]]; 
    if ([[self.office boxAddress] length] > 0) { 
     [box setText:[self.office boxAddress]]; 
    } 
    [zip setText:[NSString stringWithFormat:@"%@ %@", [self.office zipCode], [self.office city]]]; 
    [phone setText:[self.office phoneNo]]; 
    [fax setText:[self.office faxNo]]; 

    [super viewWillAppear:animated]; 
} 

Répondre

0
if ([[self.office boxAddress] length] > 0) { 
    [box setText:[self.office boxAddress]]; 
} 

Si la longueur de boxAddress est 0 alors box continuera à contenir tout le texte que vous définissez dans la dernière fois que la vue est apparu.

Vous allez devoir masquer et afficher box chaque fois que la vue apparaît non seulement lorsque la vue est chargée, car la vue peut être chargée puis utilisée pour afficher plusieurs office s différents.

+0

Mais je pensais que la méthode viewWillAppear est exécutée chaque fois que la vue est affichée, donc si 'boxAddress' est vide, il ne devrait pas apparaître? Comment pourrais-je me cacher et montrer «box»? Si je me cache, les UILabels seront-ils placés "dessus" pour ainsi dire? –

+0

'viewWillAppear' est appelé quand vous attendez mais rien ne réinitialise le contenu de votre vue pour vous si vous ne mettez pas à jour' box' il continuera à afficher tout ce qu'il contenait la dernière fois que la vue est apparue. Si vous masquez «box», il ne se passera rien aux autres étiquettes, vous devrez les repositionner vous-même. Une solution courante pour ce type d'interface consiste à faire de chaque champ une cellule dans une vue de table afin que vous puissiez ajuster les cellules qui apparaîtront et qu'elles s'empileront verticalement. – Jonah

+0

Donc, la solution la plus simple serait d'utiliser une tableview? Quel serait le pseudo-code pour le 'cellForRowAtIndexPath'? Serait-ce en utilisant un commutateur sur 'row' et en affichant ensuite des données différentes en fonction des lignes? –

Questions connexes