在我当前的应用程序中,我有一些由所有UIViewControllers共享的功能,如HUD,连接库,标签手势等。
我认为避免重复代码的一种好方法是使用这些属性和方法创建一个名为"BaseViewController"
的控制器,所有正常的UIViewControllers
都在扩展它。我认为这将是一个很好的方法。
此外,所有这些控制器都按标签栏进行分组,有时还会使用导航栏。
(1)TabBar
(1.1)Controller_ (1.2)的NavBar 的 _ __ _ __ _ __ _ __ (1.3)NavBar_的 _ __ _ __ _ __ (适用1.4)控制器
(1.2.1)Controller____(1.3.1)Controller
(1.2.1.1)Controller__(1.3.1.1)Controller
当我想按下其中一个标签时要显示一个弹出窗口时,问题就来了,要求一个别针。此功能在-(BOOL)tabBarController:(UITabBarController *)tabBarController shouldSelectViewController:(UIViewController *)viewController
方法内的BaseViewController中实现。
一般情况下没有问题,但在访问了一些深度控制器(如(1.2.1.1)或(1.3.1.1))后,弹出窗口会一直显示在那里,即使此视图当前未显示。
就像所有UIViewControllers
共享BaseViewController
的同一个实例,而最后创建的是始终被调用的那个。
所以也许有一些关于Objective C的东西我目前还没有理解,那会有什么解决方案呢?
修改
-(BOOL)tabBarController:(UITabBarController *)tabBarController shouldSelectViewController:(UIViewController *)viewController{
UIViewController *destController = viewController;
if ([destController isKindOfClass:[UINavigationController class]]) {
destController = [((UINavigationController *) viewController) topViewController];
}
if (![destController isKindOfClass:[TransactionsListViewController class]] && ![destController isKindOfClass:[BalanceViewController class]]) {
return YES;
}
User *user = [DPreferences getCurrentUser];
if ([user didPinExpired]) {
PinPopUpViewController *pinVC = [self.storyboard instantiateViewControllerWithIdentifier:@"PinPopUpViewController"];
self.pinPopViewController = pinVC;
[pinVC.view setFrame:CGRectMake(0, 0, 280, 200)];
pinVC.mTag = k_BaseViewController_PinTransactionList;
pinVC.delegate = self;
[self presentPopupViewController:pinVC animationType:MJPopupViewAnimationFade];
return NO;
} else {
return YES;
}
}
我正在使用MJPopup lib来显示弹出视图,要查找顶视图使用此方法:
-(UIView*)topView {
UIViewController *recentView = self;
while (recentView.parentViewController != nil) {
recentView = recentView.parentViewController;
}
return recentView.view;
}