在导航到选项卡之前,不会调用UITabBarView内部的UICollectionView数据源方法

时间:2013-10-07 02:07:42

标签: uitableview uitabbarcontroller uicollectionview

我有一个可以重现的问题。我可以看到问题是什么,但对于我的生活,我无法弄清楚如何纠正它。首先,让我解释一下视图结构。

窗口的根视图控制器是TabBarController。 TabBarController包含两个视图,NavigationController 1(nav),其根视图控制器设置为UITableView和NavigationController 2(nav2),其根视图控制器设置为UICollectionView。以下是AppDelegate中的所有设置:

 WTATableView *tv = [[WTATableView alloc] initWithNibName:@"WTATableView" bundle:nil];
 UINavigationController *nav = [[UINavigationController alloc] 
 initWithRootViewController:tv];
 nav.tabBarItem.title = NSLocalizedString(@"Birthday List", nil);
 nav.tabBarItem.image = [UIImage imageNamed:@"birthdaycake"];


WTACollectionViewController *cv = [[WTACollectionViewController alloc] 
initWithCollectionViewLayout:[[UICollectionViewFlowLayout alloc] init]];


UINavigationController *nav2 = [[UINavigationController alloc]    
initWithRootViewController:cv];
nav2.tabBarItem.title = NSLocalizedString(@"Birthday Grid", nil);
nav2.tabBarItem.image = [UIImage imageNamed:@"package"];

UITabBarController *tabController = [[UITabBarController alloc] init];
tabController.viewControllers = @[nav, nav2];
self.window.rootViewController = tabController;
[self.window makeKeyAndVisible];
return YES;

CollectionView订阅由条目视图控制器发布的通知,并获取通知UserInfo字典中返回的数据,并通过调用数据源方法更新UICollectionview。这是代码:

-(void)handleNotification:(NSNotification *)notification

{
   [self.birthdays addObject:[notification userInfo]];

 NSLog(@"Calling handle method");

if([self.birthdays count] == 1){
    [self.collectionView reloadData];
}
if (self.birthdays.count > 1) {
     NSLog(@" Number of itmes in section B: %d", [self.collectionView 
numberOfItemsInSection:0]);        [self.collectionView    
insertItemsAtIndexPaths:@[[NSIndexPath indexPathForItem:   (self.birthdays.count -1) 
inSection:0]]];
}


}

所以在包含nav并将其根控制器设置为UITableView的第一个Tab Bar项目中,如果我点击NavBarButton以显示模态视图控制器并获取用户条目,然后关闭模态控制器以返回到UITableVIew,我得到了新的表条目。如果我然后点击包含nav2及其根控制器作为UICollectionView的标签栏项目,然后返回到UITable标签栏项目,我可以继续添加任意数量的条目,没有问题。但是,如果我没有导航到包含uicollectionview的标签栏项目并尝试从uitableview添加第二个条目,我每次都会遇到崩溃,“。”部分中的项目数无效。

我可以看到,如果我不导航到uicontroller选项卡,则永远不会调用uicontroller的数据源方法。就像UICollectionView没有被初始化,直到我导航到标签栏,但我知道这是因为我NS注销了init方法,并且在应用程序首次启动时查看了加载方法。我认为这可能与uicollectionview被包裹在nav2控制器中有关,所以我把它带走了,我也完全相同的行为......我觉得我在这里错过了一些令我很悲伤的东西......任何建议将不胜感激。

1 个答案:

答案 0 :(得分:0)

我想出了如何让它发挥作用。感觉“hacky”,但它的工作原理:-)我必须在代码中模拟标签栏导航事件。在上面概述的处理程序方法中,在birthdays == 1的情况下,我添加了self.TabBarController.selectedIndex = 1;然后,在cellForItemAtIndexPath方法中,在返回单元格之前,我插入了self.tabBarController.selectedIndex = 0;我仍然希望我知道根本原因,从uicollectionview tabb到底和从uicollectionview tabb到底是什么确实......