如何在现有导航控制器中设置选项卡栏控制器?

How do I set up a Tab Bar Controller within an existing Navigation Controller?

我是 iOS 的新手。我正在构建一个应用程序并且 运行 遇到了问题。我有一个导航控制器,其堆栈顶部有一个 table 视图控制器。当我在那个 table 视图控制器中 select 一行时,我想看到的是一个 collection 视图,其中包含以下内容:

我的代码如下所示:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{


    NewTabBarController *tbc = [[NewTabBarController alloc] init];

    UIImagePickerController *takeAPicture = [[UIImagePickerController alloc] init];

UITabBarItem *tabItem = [takeAPicture tabBarItem];
    [tabItem setImage:[UIImage imageWithContentsOfFile:@"CameraIcon.jpg"]];
    [tabItem setTitle:@"Take a photo!"];

    UICollectionViewFlowLayout *photoFlow = [[UICollectionViewFlowLayout alloc] init];
    PhotoCollectionViewController *photoHub = [[PhotoCollectionViewController alloc] initWithCollectionViewLayout:photoFlow];

    [tbc setViewControllers:[NSArray arrayWithObjects:photoHub, takeAPicture, nil]];

    NSArray *items = [[items accessor] allItems];

    Item *item = [items objectAtIndex:[indexPath row]];

    [photoHub setItem:item];
    [photoHub useLayoutToLayoutNavigationTransitions];


    [[self navigationController] pushViewController:tbc animated:YES];

}

然后在我的 PhotoCollectionViewController 实现中我有:

@syntesize item;

- (void)viewDidLoad {
    [super viewDidLoad];

UINavigationItem *itemHeader = [self navigationItem];
    [itemHeader setTitle:[item itemName]];

    UITabBarItem *tabItem = [self tabBarItem];
    [tabItem setImage:[UIImage imageWithContentsOfFile:@"itemImage.jpg"]];
    [tabItem setTitle:[NSString stringWithFormat:@"Photos of %@", [item itemName]]];

}

我的问题是,当我 select 单元格时, collection 视图加载,我可以看到我在 collection 视图中设置的单元格,但是导航栏项没有标题,标签栏项有 "Photos of (null)" 且没有图像。 "Take a photo!" 文本出现,但图像没有出现。

你们知道我如何重组它以使一切正常进行吗?我一定是在使用 tab 和 nav 的方式上做错了 controllers.I 在应用程序的这个阶段之前不希望有任何选项卡,这已经是 3 或 4 个 VC。我是否应该从 App Delegate 开始使用标签栏控制器?

这里的问题是您将标签栏控制器推送到导航控制器堆栈上。标签栏的视图控制器将有一个导航项,但当视图控制器在屏幕上时,它们的导航项不会显示。相反,选项卡栏控制器的导航项出现在屏幕上。

您可以使用 self.tabBarController.navigationItem,但是每个视图控制器每次显示 on/off 屏幕时都必须修改导航项,这真的很乱。

如果您打算使用 UITabBarController,我建议您要么以模态方式呈现它,要么将其作为您的 UIWindow 上的根视图控制器。很难让它作为导航控制器的视图控制器堆栈中的视图控制器正常工作。

您的标签栏项目未显示其名称是一个单独的问题。这是因为 viewDidLoad 在您设置项目实例之前被调用,特别是当您调用 [tbc setViewControllers:[NSArray arrayWithObjects:photoHub, takeAPicture, nil]];

时它被调用

您可以通过在视图 did load 中设置断点来确认这一点,您会看到该项目为 nil。如果你还没有,你应该在 PhotoCollectionViewController 中重载你的 setItem: 方法,并且让那个方法也更新你的 UI.