0

我对一类中的一个属性有疑问。如果有什么不同,我正在使用 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);
}

这两种方法addTimesubtractTime做他们应该做的事情,并且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];
}

我还尝试创建一个NSAttributedStringwithstringWithFormat而不是,initWithString但问题仍然存在,它不是返回timeInSeconds我之前使用addTimeand设置的属性的值subtractTime,而是调用创建一个新实例的getter,timeInSeconds因为在我的 getter 中我有惰性实例化.

我试图不为该属性编写 getter/setter(因为我使用的是 iOS 6.1),但这没有区别。

如果我只是将标签设置为一些随机字符串,它会起作用。问题是,如果我知道timeInSeconds55 的值,它仍然会创建一个新的_timeInSeconds.

因为我是法国人,所以我用我的英语尽力了,如果这个问题已经被一个初学者的 iOS 开发者问过,请不要回答,只是重定向我。不过没找到答案,谢谢!

编辑:这是自定义吸气剂

- (float)timeInSeconds
{
if (!_timeInSeconds) {
    _timeInSeconds = 0;
}

return _timeInSeconds;
}

第二次编辑:

我犯的愚蠢的初学者错误是addTime和subtractTime实际上是在实现一个协议,他们设置了另一个类中“存在”的属性,这就是我无法访问它的原因!另一个需要该协议的类正在创建一个新的类实例,其中写入了 addTime 和 subtractTime。

需要做的是将控制器设置为协议的委托。我在 viewDidLoad 方法中这样做了:

self.view.delegate = self;

感谢所有的帮助。

4

2 回答 2

1

在您的头文件中,声明此属性:

@property (assign) float timeInSeconds;

在实现文件中:

@synthesize timeInSeconds = _timeInSeconds;

- (void)viewDidLoad
{
    [super viewDidLoad];
    _timeInSeconds = 0.0f;
}

- (void)addTime
{
    _timeInSeconds += 5.0f;
}

这应该初始化timeInSeconds为零,然后每次调用时将其值增加 5 addTime。要在标签中使用其值:

- (void)updateLabelTime
{
   self.label.text = [NSString stringWithFormat:@"%f", _timeInSeconds];
}
于 2013-04-16T18:03:58.807 回答
0

在您的自定义 getter 中,您将标量值分配给对象属性。事实上,将零分配给对象属性相当于将对象设置为零。

你需要做的是:

- (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;
}
于 2013-04-16T19:17:34.377 回答