标签没有在setter中更新

时间:2012-01-02 20:49:43

标签: iphone ios5 uilabel settext

好的,所以这个问题有点奇怪,因为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的行。

感谢您的帮助!

欢呼声, 马特

1 个答案:

答案 0 :(得分:1)

如果您使用了笔尖

当笔尖加载并建立所有连接时......(来自Resource Programming guide

  

查找set OutletName:形式的方法,如果存在这样的方法则调用它

因此,nib将加载并调用setCurrentDate:传递未归档的UILabel作为参数

在您的方法中,使用传递给方法的本地引用配置UILabel

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

您在任何时候都不会在ivar中存储对此UILabel的引用,因此从技术上讲,您已泄露标签,并且由于您尚未设置ivar currentDate,因此它将初始化为{{1 }}。这是一个用不正确的实现覆盖setter的危险。

在你的方法的某个时刻,你应该将你的ivar设置为传入的变量。普通的setter看起来像这样

nil

<强>但是

在你的例子中我根本不会担心这会改变这个

- (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];