如何停止将 UIViewController 推到自身之上?

Posted

技术标签:

【中文标题】如何停止将 UIViewController 推到自身之上?【英文标题】:How to stop pushing a UIViewController on top of itself? 【发布时间】:2014-02-27 16:17:45 【问题描述】:

使用以下简单布局。我有一个 UINavigation 控制器,带有一个根视图控制器。在根视图控制器中,我还有两个可以从根视图控制器推送的视图控制器。当我的应用程序靠近 iBeacon 时,它能够通过控制器推送某个内容。虽然 iBeacon 无关紧要,但我遇到的问题有时是同一个 View Controller 在它已经显示时会被推送,从而导致崩溃。

如何防止这种情况发生?我想确保某个视图控制器是否已经被推送,不要再推送它,但是,如果需要推送另一个视图控制器,弹出不是根视图控制器的那个,然后推送那个。

错误信息:

2014-02-27 11:16:08.038 Gimbal Proximity[3397:60b] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'Can't add self as subview'
*** First throw call stack:
(0x3028ee83 0x3a5eb6c7 0x3028edc5 0x32a1ea67 0x32a1e9f3 0x32be74f9 0x32a24cf5 0x32be6d4d 0x32ba43e9 0x32ac1a17 0x32ac1821 0x32ac17b9 0x32a13353 0x32699943 0x32695167 0x32694ff9 0x32694a0d 0x3269481f 0x3268e54d 0x30259f69 0x302578f7 0x30257c43 0x301c2471 0x301c2253 0x34efc2eb 0x32a77845 0xe7489 0x3aae4ab7)
libc++abi.dylib: terminating with uncaught exception of type NSException

Beacon 1 是根视图控制器。

这是从我的根视图控制器推送视图控制器的代码。

NSArray* views = [self.navigationController viewControllers];
NSLog(@"views %@", views);

if ([visit.transmitter.name isEqualToString:@"Beacon1"])

    NSLog(@"Welcome to Beacon 1");
    NSLog(@"Beacon 1 %@", self.navigationController.topViewController);

    [self showLabels];
    [self BeaconOne:@"10"];


else if ([visit.transmitter.name isEqualToString:@"Beacon2"])

    NSLog(@"Welcome to Beacon 2");


    ProductViewController *product_VC = [self.storyboard instantiateViewControllerWithIdentifier:@"ProductViewController"];
    product_VC.productNumber  = @"0234609";
    [self.navigationController pushViewController:product_VC animated:YES];
    NSLog(@"Beacon 2 %@", self.navigationController.topViewController);

else if ([visit.transmitter.name isEqualToString:@"Beacon3"])

    NSLog(@"Welcome to Beacon 3");


    CurrentPromotionsViewController *currentPromotions_VC = [self.storyboard instantiateViewControllerWithIdentifier:@"CurrentPromotionsViewController"];
    currentPromotions_VC.storeNumber          = 10;
    currentPromotions_VC.productCountryOrigin = @"France";
    currentPromotions_VC.productCategory      = @"Wine";
    [self.navigationController pushViewController:currentPromotions_VC animated:YES];

    NSLog(@"Beacon 3 %@", self.navigationController.topViewController);

【问题讨论】:

【参考方案1】:

您可以尝试在您的视图控制器中放置一些通知,并让它通知您的根控制器。例如,当它加载时,发回它已加载的通知,该通知设置一个标志(isShowing = YES 或类似的东西),如果设置了该标志,则不要再次推送该控制器。当弹出控制器以停用标志时,可以发回另一个通知。

【讨论】:

以上是关于如何停止将 UIViewController 推到自身之上?的主要内容,如果未能解决你的问题,请参考以下文章

如何在情节提要中正确创建覆盖视图?

两个 UIView,一个 UIViewController(在一个 UINavigationController 中)

UIViewController 停止在 UIWebView 上接收触摸事件

如何正确访问此嵌套流中的tabBarController?

关闭时停止 UIViewController 动画

如何使用 flexbox 将按钮推到页面底部? [复制]