我知道这个问题已被问过几次了,但是当我在我的UITabBarController
类中使用AppDelegate
并且viewControllers只在那里设置时,我仍然坚持这个案例
self.tabBarController.viewControllers =
@[aboutUsNavController,myProfileNavController,
projectsListNavController, feedsNavController,homeViewController];
现在我想要的是点击TabBar项目feedsNavController
而不是 viewWillAppear
执行任务(因为它正在推动detailView
来自{ {1}})。
我在同一个类中设置了委托来执行navigationController
委托方法:
UITabBarController
但是
AppDelegate *appDelegate =
(AppDelegate *)[[UIApplication sharedApplication] delegate];
appDelegate.tabBarController.delegate = self;
仅在我切换TabBar项目时有效,但不是第一次?
我有什么方法可以拨打-(void) tabBarController:(UITabBarController *)tabBarController didSelectViewController:(UIViewController *)viewController
来代替:
UITabBarDelegate
为了在按下-(void)tabBar:(UITabBar *)tabBar didSelectItem:(UITabBarItem *)item
时获得参考?
或任何其他方法将不胜感激。
答案 0 :(得分:11)
想出办法:
实际上UITabBarControllerDelegate
方法仅在加载了特定标签后才会被调用。
因此,我在[self getFeedsFromServer];
(第一次)执行了任务viewDidLoad
,然后又在
-(void) tabBarController:(UITabBarController *)tabBarController didSelectViewController:(UIViewController *)viewController
{
NSLog(@"Selected INDEX OF TAB-BAR ==> %i", tabBarController.selectedIndex);
if (tabBarController.selectedIndex == 3) {
[self getFeedsFromServer];
}
}
按我的意愿工作!
答案 1 :(得分:1)
如果您想执行任务1次,那么ViewDidLoad最适合它。每次ViewController聚焦时都会调用ViewWillAppear,但只要在堆栈上推送该控件时就调用ViewDidLoad。
答案 2 :(得分:0)
你是什么意思'因为它是通过navigationController推送一个detailView'?你的问题不太明确。
但也许这件事我可以通过我的理解来帮助你:
- (void)tabBarController:(UITabBarController *)theTabBarController didSelectViewController:(UIViewController *)viewController
{
NSUInteger indexOfTab = [theTabBarController.viewControllers indexOfObject:viewController];
NSLog(@"Tab index = %u (%u)", indexOfTab);
}