Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c NSTextField+;斯泰默_Objective C_Cocoa_Nstimer_Nstextfield - Fatal编程技术网

Objective c NSTextField+;斯泰默

Objective c NSTextField+;斯泰默,objective-c,cocoa,nstimer,nstextfield,Objective C,Cocoa,Nstimer,Nstextfield,我正在寻找一种在应用程序空闲时在NSTextField中每隔一段时间显示字符串的方法。我知道有一种方法是使用睡眠,尽管我认为这不是处理这个问题的最佳方法。我认为NSTimerscheduledTimerWithTimeInterval可能是一个很好的方法,但我不确定如何做 这是我的密码: - (void)showTextAtInterval { NSTextField *textLabel; [textLabel setStringValue:[NSString stringWithForm

我正在寻找一种在应用程序空闲时在
NSTextField
中每隔一段时间显示字符串的方法。我知道有一种方法是使用
睡眠
,尽管我认为这不是处理这个问题的最佳方法。我认为
NSTimer
scheduledTimerWithTimeInterval
可能是一个很好的方法,但我不确定如何做

这是我的密码:

- (void)showTextAtInterval {

NSTextField *textLabel;

[textLabel setStringValue:[NSString stringWithFormat:@"06/01/14"]];
sleep(5);
[textLabel setStringValue:[NSString stringWithFormat:@"Headlines"]];
....

}
编辑:尝试了此操作,但仅静态显示“标题”

[self startTimer];

- (void)startTimer {

    [NSTimer scheduledTimerWithTimeInterval:5 target:self selector:@selector(showTextAtInterval) userInfo:nil repeats:YES];
    return;
}

- (void)showTextAtInterval {

    NSTextField *textLabel;

    [textLabel setStringValue:[NSString stringWithFormat:@"06/01/14"]];
    [textLabel setStringValue:[NSString stringWithFormat:@"Headlines"]];

}
初始化计时器

-(void)awakeFromNib{
    [super awakeFromNib];
     NSTimer *timer = [NSTimer scheduledTimerWithTimeInterval:5 target:self selector:@selector(showTextAtInterval) userInfo:nil repeats:YES];

}
并使用选择器:

- (void)showTextAtInterval {

NSTextField *textLabel;

[textLabel setStringValue:[NSString stringWithFormat:@"06/01/14"]];

[textLabel setStringValue:[NSString stringWithFormat:@"Headlines"]];
....

}

为了纠正这个错误,我认为您应该添加一个私有变量,并在
showTextAtInterval
中进行切换

- (void)showTextAtInterval {

NSTextField *textLabel;
switch(iTimer)

{

case 0:

[textLabel setStringValue:[NSString stringWithFormat:@"06/01/14"]];

break;

case 1:

[textLabel setStringValue:[NSString stringWithFormat:@"Headlines"]];

break;

....

}

iTimer ++;

}

您的代码有正确的想法,只需要一些更改

首先,您发现不要使用
睡眠
——这会完全停止当前线程,如果您像以前那样从主线程调用它,那么实际上就是您的应用程序

有很多方法可以做到这一点<您选择的code>NSTimer是一个不错的选择,正如您所说,您只想在程序空闲时显示消息,
NSTimer
有一条
invalidate
消息,可用于停止计时器,当您的代码不再空闲时可调用该计时器

UI更新必须发生在主线程上,并且不一定是同步的——从更新UI的方法返回时,UI可能尚未反映更改。这就是为什么你只看到“标题”,你有两个UI更新调用在另一个之后打开,第二个在你看到第一个的效果之前完成

您需要做的是:暂停,显示第一条消息,暂停,显示第二条消息,根据需要重复。因此,请更改代码,以便在第一个计时器触发器上显示第一条消息,在第二个计时器触发器上显示第二条消息,等等。您可以使用实例变量跟踪应首先显示的消息。最好创建一个“idle message”类,其中包含启动和停止消息的方法,并将所有消息选择和显示逻辑保留在该类中,您的计时器和其他状态应该是该类的实例变量。确保所有UI更新都发生在主线程上,您可以通过确保
NSTimer
在该线程上调度来实现这一点(并将逻辑放在start方法中)


HTH

这项工作是否会从NIB中唤醒?我做了一些类似于
[self startTimer]
然后将
NSTimer
放入
-(void)startTimer
,但是
textLabel
只显示一个标签(最后一个,在本例中为“标题”),不循环或任何内容。thx@ctfd然后你应该把
[self startTimer]
放在
awakeFromNib
中,注意选择器是不正确的,来自Apple文档:“选择器应该有以下签名:
timerFireMethod:
(包括一个冒号,表示该方法带有参数)。计时器将自身作为参数传递。”@nicael,将函数置于
awakeFromNib
中的问题是,我不想立即显示文本,而是根据需要显示文本?我该如何准确地使用它。问题中显示的代码不会显示任何内容,但您说它显示“标题”。你的实际代码是什么?(编辑你的问题,不要发表评论。)@CRD,这是实际代码。当您运行项目时,它会显示“标题”。在上述代码中,
textlab
是一个未初始化的局部变量
showTextAtInterval
——该代码将无法工作。在实际代码中,
textlab
是类的
IBOutlet
实例变量。像这样的细节问题。我将在下面添加一个答案。不玩devils advocate,但即使您将实例变量更改为
NSTextView*textLabel
,而不使用
IBOutlet
,它仍会执行相同的操作。关键是您的代码正在对未初始化的变量调用方法,任何试图帮助你的人都会看到这一点,并指出这是问题所在。只是因为您编写了它并生成了输出,我才知道这并不是您真正的代码。当您简化代码以适应问题时,您必须小心不要引入错误或遗漏关键内容。你能告诉我为什么它必须留在主线上吗?我并不质疑它的有效性,但我在使用使用动画的子视图时遇到了类似的问题。这似乎有点奇怪,这些东西不能在后台运行。你提到的暂停计时器的标准方法是什么?thxAll UI更新本身必须在主线程上,这是苹果的规则。您可以在其他线程上运行代码,以确定UI应如何更改、使用屏幕外缓冲区等,只需更新本身就需要在主线程上。您已经有了正确的计时器,它是一个重复计时器。您不暂停计时器,但当不再需要显示空闲消息时(如果需要重新启动显示,请创建新计时器),计时器将失效。