如何停止将 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 中)