尝试动画标签时面临NSThread难度

时间:2011-11-21 10:33:26

标签: iphone ios-simulator

我对IOS编程很新,我对NSThread感到怀疑。 我的问题是,我的视图中有一个 UILabel ,我希望隐藏并使其在每5秒后连续可见。 为此,我使用了 NSThread ,如下所示。

[NSThread detachNewThreadSelector:@selector(animate) toTarget:self withObject:nil];

    -(void) animate
    {
        while(animateLabel){
               [NSThread sleepForTimeInterval:5];
                if(label.hidden){
                    NSLog(@"Label is hidden");
                    [label setHidden:NO];
                }else
                 { 
                    NSLog(@"Label is vissible");
                   [label setHidden:YES];
                   }


  }
}

现在我"标签被隐藏"和"标签是可变的" 每隔5秒后连续记录一次。但我的标签并没有被隐藏起来。

我用 NSTimer 做了它并且它正在工作。

但是,上面的代码有什么问题?如果此代码没有问题,为什么NSThread无法做到?

3 个答案:

答案 0 :(得分:1)

您需要在主线程上执行此操作。

试试这个 -

[NSThread performSelectorOnMainThread:@selector(animate) toTarget:self withObject:nil];

因为你有while循环

删除睡眠并添加runloop

[[NSRunLoop currentRunLoop] runUntilDate:(NSDate*)]

答案 1 :(得分:0)

UI只能由主线程更改。而不是创建新线程,您可以使用选择器  试试这个 -

[self performSelectorOnMainThread:@selector(animate) withObject:nil afterDelay:5.0 ];

答案 2 :(得分:0)

我的坏,没有读到您故意用NSThread做的,这里是如何用NSTimer做的:

如果您从主线程创建NSTimer,您甚至不需要处理线程安全问题。

在Header文件中声明一个NSTimer,以便您可以在取消它时使用它(我还假设您的标签名为'mainLabel'并且声明正确):

NSTimer *labelVisibilityTimer;
@property (nonatomic,retain) NSTimer *labelVisibilityTimer;

在您的实现文件中,正确合成Timer并使用将触发可见性更改的方法对其进行初始化。

@synthesize labelVisibilityTimer;

- (void)viewDidLoad{
    self.labelVisibilityTimer = [NSTimer scheduledTimerWithTimeInterval:5.0 target:self selector:@selector(toggleVisibilityOfLabel) userInfo:nil repeats:YES];
}

-(void)toggleVisibilityOfLabel{
    mainLabel.hidden = !mainLabel.hidden;
}


- (void)viewDidUnload{
    [super viewDidUnload];
    self.labelVisibilityTimer = nil;
}

- (void) dealloc{
    [super dealloc];
    [labelVisibilityTimer release];
}