我得到这个神秘的消息:wait_fences: failed to receive reply: 10004003我在谷歌上搜索过,人们认为这与没有正确地删除UITextField或Alert有关。我有一个文本框在我的应用程序,我向你保证我释放它正确使用resignFirstResponder等…当我从子视图打开MPMusicPickerController时我得到这个消息,这有什么区别吗。我真的需要得到这个固定,因为它搞乱了我的整个应用程序!
谢谢,布拉德。
Edit1:
- (IBAction)openMediaPicker:(id)sender {
[[UIApplication sharedApplication] setStatusBarHidden:YES withAnimation:UIStatusBarAnimationFade];
MPMediaPickerController *mediaPicker = [[MPMediaPickerController alloc] initWithMediaTypes:MPMediaTypeAny];
mediaPicker.delegate = self;
mediaPicker.allowsPickingMultipleItems = YES;
mediaPicker.prompt = @"Select songs to play";
[self presentModalViewController:mediaPicker animated:YES];
[mediaPicker release];
}
// Media picker delegate methods
- (void)mediaPicker: (MPMediaPickerController *)mediaPicker didPickMediaItems:(MPMediaItemCollection *)mediaItemCollection {
AppAppDelegate *appDelegate = (AppAppDelegate *)[[UIApplication sharedApplication] delegate];
[appDelegate.tr2 stop];
[playstopButton setHidden:NO];
[playstopButton setImage:[UIImage imageNamed:@"Stop-Music-Button.png"] forState:UIControlStateNormal];
// We need to dismiss the picker
[self dismissModalViewControllerAnimated:YES];
[[UIApplication sharedApplication] setStatusBarHidden:NO withAnimation:UIStatusBarAnimationFade];
// Assign the selected item(s) to the music player and start playback.
[self.musicPlayer stop];
[self.musicPlayer setQueueWithItemCollection:mediaItemCollection];
[self.musicPlayer play];
}
- (void)mediaPickerDidCancel:(MPMediaPickerController *)mediaPicker {
// User did not select anything
// We need to dismiss the picker
[self dismissModalViewControllerAnimated:YES];
[[UIApplication sharedApplication] setStatusBarHidden:NO withAnimation:UIStatusBarAnimationFade];
}
一般:
-
你不应该在
viewWillAppear
只在viewDidAppear
做任何动画。 仅在 wait_fences
可能出现的一个非常常见的情况是,当你有一个动画对话框(如你的MPMediaPickerController
),导致另一个动画视图出现(如自定义模式UIViewController
)或类似的,在这种情况下,你需要"推迟"第二个视图控制器的呈现,像这样:[self performSelector:@selector(showMyOtherViewController) withObject:nil afterDelay:0.1];
viewWillAppear
中准备您的数据,出口等。也可以查看这个答案https://stackoverflow.com/7194182。
编辑
"调试"冲突动画的一个好方法是简单地将动画设置为NO
,因此在代码中而不是
[self presentModalViewController:mediaPicker animated:YES];
[self dismissModalViewControllerAnimated:YES];
只是做:
[self presentModalViewController:mediaPicker animated:NO];
[self dismissModalViewControllerAnimated:NO];
并检查wait_fences
错误是否消失,是否实现了正确的行为(但没有动画)。如果是这种情况,您需要一些performSelector:withObject:afterDelay:
-magic。
编辑:请注意,您可以在iOS 5.0中执行以下操作:
[self dismissViewControllerAnimated:YES completion:^{
[self presentViewController:anotherViewController animated:YES completion:NULL]
}
这意味着首先,当前呈现的视图控制器(例如ModalViewController)被解除,当动画完成时,你可以调用另一个块。在本例中显示另一个UIViewController
我也注意到,替换clickbuttonatindex:与did下课withbuttonindex:当使用UIActionSheet或UIAlertView似乎使错误信息消失。