Wait_fences:收到回复失败:10004003



我得到这个神秘的消息: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];
}

一般:

  1. 你不应该在viewWillAppear只在viewDidAppear做任何动画。

  2. 仅在viewWillAppear中准备您的数据,出口等。
  3. wait_fences可能出现的一个非常常见的情况是,当你有一个动画对话框(如你的MPMediaPickerController),导致另一个动画视图出现(如自定义模式UIViewController)或类似的,在这种情况下,你需要"推迟"第二个视图控制器的呈现,像这样:

        [self performSelector:@selector(showMyOtherViewController) 
                   withObject:nil 
                   afterDelay:0.1];
    

也可以查看这个答案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似乎使错误信息消失。

最新更新