以下是代码:
-(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的行。
感谢您的帮助!
欢呼声, 马特
答案 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];