如何在现有导航控制器中设置标签栏控制器?

时间:2015-01-14 17:03:34

标签: uinavigationcontroller uitabbarcontroller

我对iOS很陌生。我正在构建一个应用程序并遇到问题。我有一个导航控制器,其堆栈顶部有一个表视图控制器。当我在该表视图控制器中选择一行时,我希望看到的是具有以下内容的集合视图:

  • 导航栏,其名称在所选单元格上显示为导航项目标题。

  • 作为主界面的集合视图

  • 带有集合视图的标签栏和imagePickerController

这是我的代码:

- (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]]];

}

我的问题是,当我选择单元格时,集合视图会加载,我可以看到我在集合视图中设置的单元格,但导航栏项目没有标题,标签栏项目有&# 34;(null)"的照片没有形象。 "拍照!"文本出现,但图像没有。

你们有什么想法我如何重组这个以使一切正常流动。我必须在使用标签和导航控制器的方式上做错事。我不希望在应用程序的这个阶段有任何标签,这已经是3或4个VC。我应该使用App Delegate的标签栏控制器吗?

1 个答案:

答案 0 :(得分:1)

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

您可以使用self.tabBarController.navigationItem,但每次视图控制器都必须在每次开启/关闭屏幕时修改导航项目,这非常麻烦。

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

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

时它会被调用

您可以通过在视图中确定加载来确认这一点,您将看到该项目为零。如果你还没有,你应该重载PhotoCollectionViewController中的setItem:方法,并让该方法也更新你的UI。