我对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无法做到?
答案 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];
}