我有一个可以重现的问题。我可以看到问题是什么,但对于我的生活,我无法弄清楚如何纠正它。首先,让我解释一下视图结构。
窗口的根视图控制器是 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 控制器中有关,所以我把它拿走了,我得到了完全相同的行为......我觉得我在这里遗漏了一些让我很伤心的东西......任何建议将不胜感激。