iOS:每x秒更新一次类方法?

时间:2014-02-20 06:08:46

标签: ios objective-c

我完全是在iOS编程和Objective-C中自学,所以请原谅我在整体术语方面缺乏知识。

我有一个ACViewController类及其各自的.h和.m文件。

此外,我有名为ACPortrait_Orient.hACPortrait_Orient.m的文件,我的ACPortrait_Orient.m包含类方法+(void)updateTimeLabel:(ACViewController *)mainView,其代码可使我的标签显示当前时间(它也在ACPortrait_Orient.h声明。

在我的ACViewController.m [ACPortrait_Orient updateTimeLabel:self];中加#import ACPortrait_Orient.h

我已尝试在[self performSelector:@selector(updateTimeLabel:) withObject:self afterDelay:1.0];方法中运行+(void)updateTimeLabel:(ACViewController *)mainView,但我得到以下内容:

  

2014-02-20 01:04:09.212 AlarmClock [5013:70b] + [ACPortrait_Orient setTimeLabelPortrait:]:无法识别的选择器发送到类0x100073e98
  2014-02-20 01:04:11.218 AlarmClock [5013:70b] * 由于未捕获的异常'NSInvalidArgumentException'终止应用程序,原因:'+ [ACPortrait_Orient setTimeLabelPortrait:]:无法识别的选择器发送到类0x100073e98 “

我希望时间标签每秒更新一次,但这种方式似乎并不起作用。反正我是否每秒都要运行那个类方法?

4 个答案:

答案 0 :(得分:2)

而不是像这样打电话

[self performSelector:@selector(updateTimeLabel:) withObject:self afterDelay:1.0];

像这样打电话

[ACPortrait_Orient performSelector:@selector(updateTimeLabel:) withObject:self afterDelay:1.0];

答案 1 :(得分:0)

首先要有正确的术语:这不是(编译时)警告,而是(运行时)异常。

其次,运行时不会抛出异常,因为它没有找到+updateTimeLabel:。这非常有效。它错过了+setTimeLabel:。我打赌,你只有一个实例方法-setTimeLable:

有两种方法:

  • 实施+setTimeLabel:
  • 但是使用实例方法而不是类方法来使用共享实例(或常规实例)似乎更好。

但是为了给你一个很好的建议,我们需要更多的信息。你为什么使用类方法? (请不要在评论中添加此内容,但在Q中。)

答案 2 :(得分:0)

尝试此逻辑每秒更新一次。如果那只是应用程序

@implementation ViewController
UILabel *label ;
- (void)viewDidLoad
{
    [super viewDidLoad];
    label = [[UILabel alloc] initWithFrame:CGRectMake(20, 50, 200, 20)];
    [self.view addSubview:label];
    [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(updateTimer) userInfo:Nil repeats:YES];
}

- (void)updateTimer{
    NSDateFormatter* dateFormatter = [[NSDateFormatter alloc] init];
    dateFormatter.dateFormat = @"yyyy-MM-dd HH:mm:ss";
    label.text = [dateFormatter stringFromDate:[NSDate date]];
}

答案 3 :(得分:0)

您说您的代码正在调用+[ACPortrait_Orient setTimeLabel:],但异常表示您正在调用+[ACPortrait_Orient setTimeLabelPortrait:],请检查您真正调用的位置+[ACPortrait_Orient setTimeLabelPortrait:],此方法是否会退出?