我在一个类中遇到一个属性的问题。如果它有任何区别,我正在使用iOS 6.1进行编码。
该类为UIViewController
,属性在头文件中声明,如下所示:
// Keeps track of time in seconds
@property (nonatomic, strong) NSNumber *timeInSeconds;
在我的实现文件中,我使用了3次属性:
一个是使用方法- (void)addTime
一个是用方法- (void)subtractTime
这两种方法使用如下属性:
- (void)addTime
{
CGFloat timeFloat = [self.timeInSeconds floatValue];
// Here I set the value of the property timeInSeconds, but I can't access that value later on in the code!
self.timeInSeconds = [NSNumber numberWithFloat:timeFloat +5];
NSLog(@"Total Time:%@", self.timeInSeconds);
}
两种方法addTime
和subtractTime
执行他们应该做的事情,并且他们保持对timeInSeconds
属性的良好跟踪,因为我添加然后减去然后添加...
问题是当我在同一个实现文件中调用第三个方法时:
- (void)updateLabelTime
{
self.label.attributedText = [[NSAttributedString alloc]initWithString:[self.timeInSeconds stringValue]];
[self.label setNeedsDisplay];
[NSTimer scheduledTimerWithTimeInterval:0.8 target:self selector:@selector(updateLabelTime) userInfo:nil repeats:YES];
}
我还尝试使用NSAttributedString
代替stringWithFormat
创建initWithString
,但问题仍然存在,而不是返回属性timeInSeconds
的值,而不是之前使用addTime
和subtractTime
进行设置,它会调用getter创建一个timeInSeconds
的新实例,因为在我的getter中我有懒惰的实例化。
我试图不为该属性编写getter / setter(因为我使用的是iOS 6.1),但没有区别。
如果我只是将标签设置为一些随机字符串,它就可以了。问题是如果我知道timeInSeconds
的值为55,它仍然会创建一个新的_timeInSeconds
。
由于我是法国人,我用英语尽力而为,如果初学者iOS开发人员已经问过这个问题并且只是重定向我,请不要回答。我找不到答案,谢谢!
编辑:这是自定义getter
- (float)timeInSeconds
{
if (!_timeInSeconds) {
_timeInSeconds = 0;
}
return _timeInSeconds;
}
第二次编辑:
我犯的愚蠢的初学者错误是addTime和subtractTime实际上正在实现一个协议,他们设置了“生活”在另一个类中的属性,这就是为什么我无法访问它!另一个需要协议的类是创建一个新的类实例,其中addTime和subtractTime被写入。
需要做的是将控制器设置为协议的委托。我在viewDidLoad方法中执行了以下操作:
self.view.delegate = self;
感谢您的帮助。
答案 0 :(得分:1)
在头文件中,声明此属性:
@property (assign) float timeInSeconds;
在实施文件中:
@synthesize timeInSeconds = _timeInSeconds;
- (void)viewDidLoad
{
[super viewDidLoad];
_timeInSeconds = 0.0f;
}
- (void)addTime
{
_timeInSeconds += 5.0f;
}
这应该将timeInSeconds
初始化为零,然后每次调用addTime
时将其值增加5。要在标签中使用其值:
- (void)updateLabelTime
{
self.label.text = [NSString stringWithFormat:@"%f", _timeInSeconds];
}
答案 1 :(得分:0)
在自定义getter中,您要为对象属性指定标量值。实际上,将零赋值给对象属性相当于将对象设置为nil。
您需要做的是:
- (float)timeInSeconds
{
if (!_timeInSeconds) {
_timeInSeconds = [NSNumber numberWithFloat:0.0f];
// or alternatively with the latest version of objective c
// you can more simply use:
// _timeInSeconds = @(0.0f);
}
return _timeInSeconds;
}