UILabel nameLabel.text = "test1"; не работает и розетка подключена - PullRequest
1 голос
/ 12 сентября 2010

Я использовал код, чтобы попытаться установить текст метки, но он не работает.Возможно, я забыл соединить розетку с этикеткой или подключил не ту розетку, но они были в порядке, как только я их проверил.Убедитесь, что xib был сохранен.

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

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

Текст по умолчанию, который у меня есть в метках 'name' & 'info' - это то, что показывает.

Это код, который получаетвызывается до вызова 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";
   }

Ответы [ 2 ]

2 голосов
/ 12 сентября 2010

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

Вы должны принудительно вызвать 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";
}

РЕДАКТИРОВАТЬ:

Другим решением было бы переместить вызов на 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;
1 голос
/ 12 сентября 2010

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

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

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

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

nameLabel.text = @"test1";
infoLabel.text = @"test2";
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...