2010-09-11 3 views
1

Я использовал код, чтобы попытаться установить текст ярлыка, но его не работает. Хотя, может быть, я забыл подключить розетку с этикеткой, или я подключил неправильную розетку, но они были в порядке, как только я их проверил. Удостоверился, что был сохранен xib.UILabel nameLabel.text = "test1"; не работает, и выход подключен

.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; 

То почти весь код, используемый в контроллере Вей, связанных с этими метками. Есть что-то, чего я не вижу, что может объяснить эту странность?

Текст по умолчанию, который у меня есть в названии ярлыков «&« информация »- это то, что отображается.

Это код, который вызывается до updateUI называют

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"; 
    } 
+0

Что посылает ваш контроллер в 'updateUI' сообщение? – BoltClock

+1

Если код, вызывающий 'updateUI', не встречается в основном потоке, тогда код UI не будет выполнен. –

+0

Я отредактирую это в! :) ty для указания, что вне – 2010-09-11 23:50:24

ответ

2

Ваш CardViewController создан, а затем вы сразу же попытаться установить текст UILabel в это представление контроллера. Проблема в том, что представление еще не загружено. Во время звонка updateUI, viewDidLoad: еще не был вызван для CardViewController, что означает nameLabel и infoLabelnil.

Вам необходимо принудительно загрузить CardViewController из NIB, прежде чем пытаться получить доступ к любому из выходов. достаточно простого [self view];. Например:

-(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:

Другим решением было бы перенести вызов updateUI к после 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; 
+0

-1 Принудительная загрузка представления является дорогой и недостаточной (вид может быть выгружен при предупреждении памяти). Я бы просто вызвал updateUI в - [CardViewController viewDidLoad]. –

+0

Несмотря на то, что ваш комментарий верен, вы не предоставляете простого решения, и вы не принимаете во внимание, что представление будет загружено позже в том же методе. Я отредактировал свой ответ, чтобы предоставить другое решение. –

+0

Ty для предложений. – 2010-09-12 20:55:33

1

Этот код некорректен:

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

Вы назначаете указатели char* переменной NSString*; вам нужно префикс строки с символом @.

Предполагая, что метод updateUI называется, nameLabel и infoLabel оба существуют, когда его называют, это должно работать:

nameLabel.text = @"test1"; 
infoLabel.text = @"test2"; 
+0

недостающие @ - это только опечатка в вопросе. Хотелось бы, чтобы все было так просто. – 2010-09-11 23:58:55

Смежные вопросы