0

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

窗口的根视图控制器是 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]]];
}


}

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

我可以看到,如果我不导航到 uicontroller 选项卡,则永远不会调用 uicontroller 的数据源方法。就像 UICollectionView 在我导航到选项卡栏之前没有被初始化,但我知道这是因为我 NSLog 了 init 方法,并且在应用程序首次启动时视图确实加载了方法。我认为这可能与 uicollectionview 被包裹在 nav2 控制器中有关,所以我把它拿走了,我得到了完全相同的行为......我觉得我在这里遗漏了一些让我很伤心的东西......任何建议将不胜感激。

4

1 回答 1

0

我想出了如何让它工作。感觉“hacky”但它有效:-) 我必须在代码中模拟一个标签栏导航事件。所以在上面概述的处理程序方法中,在生日 == 1 的条件下,我添加了 self.TabBarController.selectedIndex = 1; 然后,在 cellForItemAtIndexPath 方法中,就在返回单元格之前,我插入了 self.tabBarController.selectedIndex = 0; 我仍然希望我知道根本原因,究竟是什么来回翻转 uicollectionview tabb ar 真的......

于 2013-10-07T13:39:28.337 回答