views:

48

answers:

2

Hi guys

I used the code to try set the label text but its not working. I though maybe I forgot to connect the outlet with the label, or i connected the wrong outlet but they were ok once I checked them. Made sure the xib was saved.

.m

@synthesize nameLabel;
@synthesize infoLabel;

-(void) updateUI
{
nameLabel.text = @"test1";
infoLabel.text = @"test2";
}

.h

UILabel * nameLabel;
UILabel * infoLabel;
@property(nonatomic, retain) IBOutlet UILabel *nameLabel;
@property(nonatomic, retain) IBOutlet UILabel *infoLabel;

Thats pretty much all the code used in the veiw controller related to these labels. Is there something i am missing that might explain this strangeness?

The default text i have in the labels 'name' & 'info' is what is showing.

This is the code that gets called prior to updateUI being called

browseDeckViewController.m

-(void) viewDidLoad 
{
    cardOnTopOfDeck = 0; 
    cardSecondFromTopOfDeck=1;
    deck = [[Deck alloc] init];
    [deck loadDeckData];
    Card *mySecondCard = [[Card alloc] init];
    mySecondCard = [deck.deckArray objectAtIndex:cardSecondFromTopOfDeck];
    secondCard = [[CardViewController alloc] initWithNibName:@"CardViewController"               
    bundle:[NSBundle mainBundle] numberOfStats:kNumStats];
    [secondCard setCard:mySecondCard];
    CGRect frame = secondCard.view.frame;
    frame.origin.x = (320-frame.size.width)/2;
    frame.origin.y = 10;
    secondCard.view.frame = frame;  
    [self.view addSubview:secondCard.view];


    topCard = [[CardViewController alloc] initWithNibName:@"CardViewController"    
    bundle:[NSBundle mainBundle] numberOfStats:kNumStats];
    Card *myTopCard = [[Card alloc] init];
    myTopCard = [deck.deckArray objectAtIndex:cardOnTopOfDeck];
    [topCard setCard:myTopCard];
    frame = topCard.view.frame;
    frame.origin.x = (320-frame.size.width)/2;
    frame.origin.y = 10;
    topCard.view.frame = frame;
    [self.view addSubview:topCard.view];
}

CardViewController.m

    -(void) setCard:(Card *)newCard 
    {
    [card release];
    card = [newCard retain];
    [self updateUI];
    }

   -(void) updateUI
   {
    NSLog(@"updateUI");
    nameLabel.text = @"test1";
    infoLabel.text = @"test2";
   }
+1  A: 

This code is incorrect:

nameLabel.text = "test1";
infoLabel.text = "test2";

You are assigning char* pointers to an NSString* variable; you need to prefix the string with the @ symbol.

Assuming that the updateUI method is called, nameLabel and infoLabel both exist when it is called, this should work:

nameLabel.text = @"test1";
infoLabel.text = @"test2";
Shaggy Frog
the missing @ are just a typo in the question. I wish it was that simple.
Code
A: 

Your CardViewController is created and then you immediately try to set the text of a UILabel in that controller's view. The problem is, the view isn't loaded yet. At the time updateUI is called, viewDidLoad: has not yet been called for the CardViewController, which means nameLabel and infoLabel are nil.

You have to force the CardViewController's view to load from the NIB before trying to access any of the outlets. a simple [self view]; would suffice. For example:

-(void) updateUI {
     NSLog(@"nameLabel's value: %@",nameLabel); //nil here
     [self view];
     NSLog(@"nameLabel's value after loading view: %@",nameLabel); //Now it's loaded
     nameLabel.text = @"test1";
     infoLabel.text = @"test2";
}

EDIT:

Another solution would be to move the call to updateUI to after addSubview:

myTopCard = [deck.deckArray objectAtIndex:cardOnTopOfDeck];
[self.view addSubview:topCard.view];
[topCard setCard:myTopCard];
frame = topCard.view.frame;
frame.origin.x = (320-frame.size.width)/2;
frame.origin.y = 10;
topCard.view.frame = frame;
Ed Marty
-1 Forcing a view load is expensive and insufficient (the view can be unloaded on a memory warning). I'd simply call updateUI in -[CardViewController viewDidLoad].
tc.
While your comment is accurate, you don't supply a simple solution, and you don't take into account that the view will be loaded later in the same method anyway. I've edited my response to provide another solution.
Ed Marty
Ty for the suggestions.
Code