0

我有一个 do 循环,我想在 SWITCH 打开时每 1 秒执行一次命令。

当我没有 DO LOOP 时,代码一次可以正常工作。

但是,一旦我添加了 LOOP,视图控制器中的任何标签都不会更新,情节提要的后退按钮不起作用,并且 SWITCH 不会关闭。从本质上讲,DO LOOP 一直在循环,但屏幕上的任何内容都不起作用,我也无法退出。

我知道我做错了。但是,我现在不知道。任何想法将不胜感激。

我附上了让我陷入困境的代码。

谢谢,

 - (IBAction)roaming:(id)sender {
UISwitch *roamingswitch = (UISwitch *)sender;

BOOL isOn = roamingswitch.isOn;

if (isOn) {

    last=[NSDate date];

    while (isOn)
    {

        current = [NSDate date];

        interval = [current timeIntervalSinceDate:last];

    if (interval>10) {

    TheCommand.text=@"ON";

    [self Combo:sendcommand];

        last=current;


    }

    }

}

else
{
    TheCommand.text=@"OFF";

}

}

4

2 回答 2

2

iOS 和 OSX 是基于事件的系统,你不能在主(UI)线程中使用这样的循环来做你想做的事情,否则你不允许运行循环运行并且事件停止被处理。

请参阅:Mac 应用程序编程指南部分“应用程序的主事件循环驱动交互”。

您需要做的是设置NSTimer一个每秒触发一次的计时器 ( ):

.h 文件:

@interface MyClass : NSView     // Or whatever the base class is
{
    NSTimer *_timer;
}

@end

.m 文件:

@implementation MyClass


- (id)initWithFrame:(NSRect)frame   // Or whatever the designated initializier is for your class
{
    self = [super initInitWithFrame:frame];
    if (self != nil)
    {
        _timer = [NSTimer timerWithTimeInterval:1.0
                                         target:self
                                       selector:@selector(timerFired:)
                                       userInfo:nil
                                        repeats:YES];
    }
    return self;
}

- (void)dealloc
{
    [_timer invalidate];

    // If using MRR ONLY!
    [super dealloc];
}

- (void)timerFired:(NSTimer*)timer
{
    if (roamingswitch.isOn)
    {
        TheCommand.text=@"ON";
        [self Combo:sendcommand];
    }
}

@end
于 2013-02-11T13:33:24.593 回答
0

给你的处理器足够的时间来更新你的视图控制器并且不被其他进程打断。我在视图控制器更新信号之前和之后给它 0.5 秒。

        [[NSRunLoop mainRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:0.5]];
    
        self.CrashingTime.text = [NSString stringWithFormat: @"Crash Time =  %f ms", outputOfCrashTime];
    
        [[NSRunLoop mainRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:0.5]];
于 2022-02-01T21:37:24.773 回答