崩溃呈现模态视图控制器

发布于 2024-10-16 03:52:25 字数 3384 浏览 7 评论 0原文

我有这个崩溃。它与其他线程类似,但又不一样。 我想首先向用户显示一个模式视图控制器,然后转到特定的视图控制器。按照提示,我在 - (void) viewDidAppear:(BOOL)animated 上执行此操作,并按照我看到的建议应用延迟。

 - (void) viewDidAppear:(BOOL)animated 
    {
      [super viewDidAppear:animated];
       [self performSelector:@selector(presentMyModal) withObject:nil afterDelay:1];
    }



     - (void) presentModal{
    ModalViewController *modal = [[[ModalViewController alloc] init] autorelease];
    [self presentModalViewController:modal animated:YES];   
   }

然后,随机地崩溃了。我在控制台中收到此消息:

<Warning>: *** Assertion failure in -[UIWindowController transition:fromViewController:toViewController:target:didEndSelector:], /SourceCache/UIKit/UIKit-1447.6.4/UIWindowController.m:186
Thu Feb  3 10:00:44 unknown MyApp[1830] <Error>: *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Attempting to begin a modal transition from <UINavigationController: 0x454260> to <ModalViewController: 0x47af00> while a transition is already in progress. Wait for viewDidAppear/viewDidDisappear to know the current transition has completed'
    *** Call stack at first throw:
    (
        0   CoreFoundation                      0x3759dc7b __exceptionPreprocess + 114
        1   libobjc.A.dylib                     0x32d9bee8 objc_exception_throw + 40
        2   CoreFoundation                      0x3759dac3 +[NSException raise:format:arguments:] + 70
        3   Foundation                          0x351a3e73 -[NSAssertionHandler handleFailureInMethod:object:file:lineNumber:description:] + 62
        4   UIKit                               0x359e92a8 -[UIWindowController transition:fromViewController:toViewController:target:didEndSelector:] + 208
        5   UIKit                               0x359e8c98 -[UIViewController presentModalViewController:withTransition:] + 2792
        6   UIKit                               0x35a7b51c -[UIViewController _tryRecursivelyPresentModalViewController:withTransition:] + 116
        7   UIKit                               0x359e84c0 -[UIViewController presentModalViewController:withTransition:] + 784
        8   UIKit                               0x359e8060 -[UIViewController presentModalViewController:animated:] + 96
        9   MyApp                         0x0005d57f -[MyAppViewController presentMyModal] + 58
        10  Foundation                          0x351724db __NSFireDelayedPerform + 366
        11  CoreFoundation                      0x37552305 __CFRUNLOOP_IS_CALLING_OUT_TO_A_TIMER_CALLBACK_FUNCTION__ + 16
        12  CoreFoundation                      0x37551cd9 __CFRunLoopDoTimer + 988
        13  CoreFoundation                      0x37521a91 __CFRunLoopRun + 1184
        14  CoreFoundation                      0x3752150b CFRunLoopRunSpecific + 226
        15  CoreFoundation                      0x37521419 CFRunLoopRunInMode + 60
        16  GraphicsServices                    0x33e76d24 GSEventRunModal + 196
        17  UIKit                               0x3591d57c -[UIApplication _run] + 588
        18  UIKit                               0x3591a558 UIApplicationMain + 972
        19  MyApp                         0x0000e75f main + 50
        20  MyApp                         0x0000e6e8 start + 52

如您所见,我等待视图出现。这可能是操作系统错误吗?看起来它试图递归地呈现其他模式视图控制器,从而引发崩溃。 多谢。

I have this crash. It is similar to other threads, but not the same.
I would like to show a modal view controller first the user goes to a specific view controller. Following the hints, I do that on - (void) viewDidAppear:(BOOL)animated, and apply a delay as I saw it's recommended.

 - (void) viewDidAppear:(BOOL)animated 
    {
      [super viewDidAppear:animated];
       [self performSelector:@selector(presentMyModal) withObject:nil afterDelay:1];
    }



     - (void) presentModal{
    ModalViewController *modal = [[[ModalViewController alloc] init] autorelease];
    [self presentModalViewController:modal animated:YES];   
   }

Afterwards, ramdomly It crashes. I get this message in console:

<Warning>: *** Assertion failure in -[UIWindowController transition:fromViewController:toViewController:target:didEndSelector:], /SourceCache/UIKit/UIKit-1447.6.4/UIWindowController.m:186
Thu Feb  3 10:00:44 unknown MyApp[1830] <Error>: *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Attempting to begin a modal transition from <UINavigationController: 0x454260> to <ModalViewController: 0x47af00> while a transition is already in progress. Wait for viewDidAppear/viewDidDisappear to know the current transition has completed'
    *** Call stack at first throw:
    (
        0   CoreFoundation                      0x3759dc7b __exceptionPreprocess + 114
        1   libobjc.A.dylib                     0x32d9bee8 objc_exception_throw + 40
        2   CoreFoundation                      0x3759dac3 +[NSException raise:format:arguments:] + 70
        3   Foundation                          0x351a3e73 -[NSAssertionHandler handleFailureInMethod:object:file:lineNumber:description:] + 62
        4   UIKit                               0x359e92a8 -[UIWindowController transition:fromViewController:toViewController:target:didEndSelector:] + 208
        5   UIKit                               0x359e8c98 -[UIViewController presentModalViewController:withTransition:] + 2792
        6   UIKit                               0x35a7b51c -[UIViewController _tryRecursivelyPresentModalViewController:withTransition:] + 116
        7   UIKit                               0x359e84c0 -[UIViewController presentModalViewController:withTransition:] + 784
        8   UIKit                               0x359e8060 -[UIViewController presentModalViewController:animated:] + 96
        9   MyApp                         0x0005d57f -[MyAppViewController presentMyModal] + 58
        10  Foundation                          0x351724db __NSFireDelayedPerform + 366
        11  CoreFoundation                      0x37552305 __CFRUNLOOP_IS_CALLING_OUT_TO_A_TIMER_CALLBACK_FUNCTION__ + 16
        12  CoreFoundation                      0x37551cd9 __CFRunLoopDoTimer + 988
        13  CoreFoundation                      0x37521a91 __CFRunLoopRun + 1184
        14  CoreFoundation                      0x3752150b CFRunLoopRunSpecific + 226
        15  CoreFoundation                      0x37521419 CFRunLoopRunInMode + 60
        16  GraphicsServices                    0x33e76d24 GSEventRunModal + 196
        17  UIKit                               0x3591d57c -[UIApplication _run] + 588
        18  UIKit                               0x3591a558 UIApplicationMain + 972
        19  MyApp                         0x0000e75f main + 50
        20  MyApp                         0x0000e6e8 start + 52

As you can see, I wait until view is appeared. Is this maybe an OS bug? It seems like it tries to present recursively other modal view controllers, provoquing crashes.
Thanks a lot.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

青柠芒果 2024-10-23 03:52:25

除了我在评论中挑剔之外,我想我也可以帮助解决这个问题。我认为你需要在其他地方寻找罪魁祸首。我用这个代码片段创建了一个新项目和一个视图控制器:

#import "VC1.h"


@implementation VC1

- (void) viewDidAppear:(BOOL)animated {
  [super viewDidAppear:animated];
  [self performSelector:@selector(presentModal) withObject:nil afterDelay:1.0];
}

- (void)presentModal {
  static int colorChooser = 0;
  VC1 *vc1 = [[[VC1 alloc] init] autorelease];
  switch (colorChooser%2) {
    case 0:
      vc1.view.backgroundColor = [UIColor whiteColor];
      break;
    default:
      vc1.view.backgroundColor = [UIColor blackColor];
      break;
  }
  colorChooser++;
  [self presentModalViewController:vc1 animated:YES];
}

@end

并且在被推送到导航控制器上后它可以完美地工作。它在黑白视图之间递归交替,并在 sim 和 3G 设备上进行了测试。

也许由于某些通知或其他异步方式,您正在执行其他一些视图转换?无论哪种方式,您都需要共享更多代码,以便任何人都知道问题出在哪里。

Apart from me being picky in the comment, I thought I could as well help with this one as well. I think you need to search for the culprit somewhere else. I created a new project and a view controller with this snippet:

#import "VC1.h"


@implementation VC1

- (void) viewDidAppear:(BOOL)animated {
  [super viewDidAppear:animated];
  [self performSelector:@selector(presentModal) withObject:nil afterDelay:1.0];
}

- (void)presentModal {
  static int colorChooser = 0;
  VC1 *vc1 = [[[VC1 alloc] init] autorelease];
  switch (colorChooser%2) {
    case 0:
      vc1.view.backgroundColor = [UIColor whiteColor];
      break;
    default:
      vc1.view.backgroundColor = [UIColor blackColor];
      break;
  }
  colorChooser++;
  [self presentModalViewController:vc1 animated:YES];
}

@end

And it works flawlessly after being pushed on the navigation controller. It is recursively alternating between black and white views, tested both in the sim and on a 3G device.

Maybe you are doing some other view transitions due to some notifications or other asynchronic means? Either way you would need to share more of your code for anyone to tell where the problem is.

白龙吟 2024-10-23 03:52:25

我们首选的解决方案是使用 -[UIViewController PresentViewController:animated:completion:] 并在完成块中执行下一个操作(例如呈现另一个 VC)。

例如:

[self presentViewController:yourViewController animated:YES completion:^{
    [yourViewController presentMyModal];
}];

该方法是在iOS 5.0中引入的。

Our preferred solution is to use -[UIViewController presentViewController:animated:completion:] and do whatever the next action is (eg presenting another VC) in the completion block.

For example:

[self presentViewController:yourViewController animated:YES completion:^{
    [yourViewController presentMyModal];
}];

This method was introduced in iOS 5.0.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文