【发布时间】:2015-05-25 09:23:20
【问题描述】:
我有这个 NSTimer 重复循环,它将检查我的应用程序中是否有任何新闻。检查部分无关紧要,它工作正常,但为了显示是否有新闻,我制作了一个名为 orangeDot 的 UIView。如果有新闻,应该是orangeDot.alpha = 1.0,如果没有,应该是orangeDot orangeDot.alpha = 0.0。但它并不总是有效。有时,当有新闻时,orangeDot 会被隐藏(alpha=0),有时则相反。这是代码:
-(void) checkForNews {
NSUserDefaults * defaults = [NSUserDefaults standardUserDefaults];
bool news = (([defaults boolForKey:@"newsFromChat"]) || ([defaults boolForKey:@"newsFromAwaiting"])) ? YES : NO;
if (news) {
NSLog(@"yay news");
[orangeDot setAlpha:1.0f];
} else {
NSLog(@"nothing new");
[orangeDot setAlpha:0.0f];
}
NSLog(@"%@",orangeDot);
}
NSLog 工作完美,这部分从来没有问题,但即使日志显示“yay news”,orangeDot 也可能被隐藏,反之亦然。但有时它会起作用......我还没有在错误中找到模式。 我不得不提到 .alpha 和 .hidden 都不能正常工作。
orangeDot 是这样坐起来的:
@property (nonatomic, retain) IBOutlet UIView * orangeDot;
并在故事板中连接。
请帮忙:)
【问题讨论】:
-
贴出计时器的周围代码。
-
NSLog 做得很完美,所以它以某种方式连接到接口。 NSLog(@"%@",orangeDot);还应该将 orangeDot 打印为 fx alpha=1.0,但它实际上隐藏在界面中。
-
可能定时器触发的代码没有在主(UI)线程上执行。我建议您将 orangeDot 方法调用作为一个块发布到主队列。
-
正是@RudiAngela 所说的,这就是为什么我希望你发布周围的代码。可以
dispatch_async(dispatch_get_main_queue(), ^{//wrap contents of -checkForNews in here}使用主线程。
标签: objective-c xcode uiview alpha iboutlet