ярлык не обновляется в сеттере - PullRequest
0 голосов
/ 03 января 2012

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

Вот код:

-(void)setCurrentDate:(UILabel *)currentDate
{

NSInteger onDay = 1; //because if it's today, you are on day one, not zero... no such thing as a day zero

//get the nubmer of days left
if( [[NSUserDefaults standardUserDefaults] objectForKey:@"StartDate"] ){ //if there is something at the userdefaults
    onDay = [self daysToDate:[NSDate date]];
}//otherwise, onDay will just be one

self.theCurrentNumberOfDaysSinceStart = onDay;

NSLog(@"On day: %d", onDay); //this is returning the correct values....

//print it out on the label
[currentDate setText:[NSString stringWithFormat:@"On day: %d", onDay]];//echoes out the current day number 

}

Итак, когда приложение запускается впервые, все в порядке. Ярлык обновляется и все. Проблема возникает, когда я нажимаю кнопку, которая в основном захватывает новую дату. В процессе он запускается так:

    //need to reload the "on day" label now
    [self setCurrentDate:self.currentDate];
    //and the "days left" label
    [self setDaysLeft:self.daysLeft];

Опять же, я думаю, что все должно быть правильно, потому что NSLog возвращает правильные вещи. Я думаю, что проблема в последней строке в первом блоке кода, который я показал ... в строке с setText.

спасибо за вашу помощь!

веселит, Matt

1 Ответ

1 голос
/ 03 января 2012

Если вы использовали перо

Когда перо загружается и устанавливает все его соединения, оно ... (Из Руководства по программированию ресурсов )

ищет метод вида set OutletName: и вызывает его, если такой метод присутствует

Следовательно, перо будет загружаться и вызывать setCurrentDate:, передавая неархивированный UILabel в качестве параметра

В вашем методе вы конфигурируете UILabel, используя local ссылку, переданную в метод

[currentDate setText:[NSString stringWithFormat:@"On day: %d", onDay]];

Вы ни в коем случае не храните ссылку на этот UILabel в иваре, поэтому технически вы утекли метку и, поскольку вы не установили ивар currentDate, она будет инициализирована как nil. Это опасность переопределения сеттера при неправильной реализации.

В какой-то момент в вашем методе вы должны установить свой ivar в переданную переменную. Обычный сеттер будет выглядеть так

- (void)setCurrentDate:(UILabel *)currentDate;
{
    if (_currentDate != currentDate) {
        [_currentDate release];
        _currentDate = [currentDate retain];
    }
}

Но

В вашем примере я бы вообще об этом не беспокоился, я бы вместо этого изменил

//need to reload the "on day" label now
[self setCurrentDate:self.currentDate];

что-то вроде

[self updateCurrentDate];

Реализация будет выглядеть примерно так:

- (void)updateCurrentDate;
{
    NSInteger onDay = 1;

    if ([[NSUserDefaults standardUserDefaults] objectForKey:@"StartDate"]) {
        onDay = [self daysToDate:[NSDate date]];
    }

    self.theCurrentNumberOfDaysSinceStart = onDay;

    [self.currentDate setText:[NSString stringWithFormat:@"On day: %d", onDay]];
}
...