我正在编写音源生成器UI,每次生成器开始生成并完成生成时,我需要更改UIImageView图像。 为此,我有
@property (weak, nonatomic) IBOutlet UIImageView *headphonesImage;
在我的UIViewController中。我像这样添加默认图像
- (void) viewDidLoad
{
...
headphonesImagesArray = [NSArray arrayWithObjects:
[UIImage imageNamed: @"Both Headphones"],
[UIImage imageNamed: @"Both Headphones Playing"],
nil];
[self.headphonesImage setAlpha: 0.5];
[self.headphonesImage setImage: headphonesImagesArray[0]];
...
}
我的音频发生器将消息发送到此方法
- (void) toneGeneratorControllerStateHasChangedWithNotification: (NSNotification *) notification
{
if([notification.name isEqualToString: ToneGenerationHasFinished])
[self.headphonesImage setImage: headphonesImagesArray[0]];
else
[self.headphonesImage setImage: headphonesImagesArray[1]];
}
问题在于虽然耳机图像变为[1],但没有任何反应。我可以在变量检查器中看到每次调用方法时都会更改headphonesImage图像,但这些更改不会出现在模拟器和iPhone的屏幕上。我甚至无法隐藏这个该死的UIImageView。 setHidden:true什么都不做。
请帮忙!
答案 0 :(得分:1)
"我的音频发生器将消息发送到此方法"
如果你正在写音频发生器,它听起来像是在后台线程上运行。您应该在主线程上发送通知,特别是如果它们触发UI更改(例如设置图像),例如:
dispatch_async(dispatch_get_main_queue(),^{
[[NSNotificationCenter defaultCenter] postNotificationName:@"toneGeneratorControllerStateHasChanged"
object:nil
userInfo:imageDict];
});
或者,您可以像Igor建议的那样将图像更改发送到主线程。缺点是你必须在任何时候使用这种通知,而不是在一个地方进行。
答案 1 :(得分:0)
这样做: -
- (void) toneGeneratorControllerStateHasChangedWithNotification: (NSNotification *) notification
{
if([notification.name isEqualToString: ToneGenerationHasFinished]) {
self.headphonesImage.image = [UIImage imageNamed:@"Both Headphones"];
}
else {
self.headphonesImage.image = [UIImage imageNamed:@"Both Headphones Playing"];
}
}
而不是setImage。
答案 2 :(得分:0)
VDL
中的
headphonesImagesArray = [NSArray arrayWithObjects:
@"Both Headphones",
@"Both Headphones Playing",
nil];
这样做:
- (void) toneGeneratorControllerStateHasChangedWithNotification: (NSNotification *) notification
{
if([notification.name isEqualToString: ToneGenerationHasFinished]) {
self.headphonesImage.image = [UIImage imageNamed: headphonesImagesArray[0]];
}
else {
self.headphonesImage.image = [UIImage imageNamed:headphonesImagesArray[1]];
}
}
答案 3 :(得分:0)
它看起来很阴暗,但似乎我找到了解决方案:
- (void) toneGeneratorControllerStateHasChangedWithNotification: (NSNotification *) notification
{
BOOL finished = FALSE;
if([notification.name isEqualToString: ToneGenerationHasFinished])
finished = TRUE;
dispatch_async(dispatch_get_main_queue(),
^{
if(finished)
[self.headphonesImage setImage: headphonesImagesArray[0]];
else
[self.headphonesImage setImage: headphonesImagesArray[1]];
});
}
据我所知,所有UI绘图都发生在主线程中。看起来通知方法在主线程中不起作用,除非你明确告诉它这样做......