如何将viewviewcontroller存储到tabbaritem中存储的viewcontroller?

时间:2010-04-09 18:32:04

标签: iphone uiviewcontroller uinavigationcontroller uitabbarcontroller uitableview

首先,我知道这是一个很长的问题。 REST ASSURED我试图自己解决这个问题(参见:StackOverflow #2609318)。这让我变成了BATTY!

在尝试并且未能在标准的moreNavigationController中实现我自己的EDIT功能之后,我决定重新实现我自己的MORE功能。

我做了以下事情:

添加一个我初始化的HOME视图控制器:initWithRootViewController

添加3个其他默认选项卡:

ResortsListViewController *resortsListViewController;
resortsListViewController = [[ResortsListViewController alloc] initWithNibName:@"ResortsListView" bundle:nil];
resortsListViewController.title = [categoriesDictionary objectForKey:@"category_name"];
resortsListViewController.tabBarItem.image = [UIImage imageNamed:@"whatever.png"];
resortsListViewController.navigationItem.title=@"whatever title";
localNavigationController = [[UINavigationController alloc] initWithRootViewController:resortsListViewController];
localNavigationController.navigationBar.barStyle = UIBarStyleBlack;
[localControllersArray addObject:localNavigationController]; 
[localNavigationController release];
[resortsListViewController release];

当我将它们添加到标签栏时,这些工作。 (即:点击它们然后进入视图控制器)

然后我将自己的MORE视图控制器添加到标签栏:

MoreViewController *moreViewController;
moreViewController = [[MoreViewController alloc] initWithNibName:@"MoreView" bundle:nil];
moreViewController.title = @"More";
moreViewController.tabBarItem.image = [UIImage imageNamed:@"more.png"];
moreViewController.navigationItem.title=@"More Categories";
localNavigationController = [[UINavigationController alloc] initWithRootViewController:moreViewController];
localNavigationController.navigationBar.barStyle = UIBarStyleBlack;
[localControllersArray addObject:localNavigationController]; 
[localNavigationController release];
[moreViewController release];

然后

tabBarController.viewControllers = localControllersArray;
tabBarController.moreNavigationController.navigationBar.barStyle = UIBarStyleBlack;  
tabBarController.customizableViewControllers = [NSArray arrayWithObjects:nil];
tabBarController.delegate = self;

这创造了必要的联系。好的,到目前为止一切都很好。我得到一个HOME选项卡,3个类别选项卡和一个自定义的MORE选项卡 - 这些都可以工作。

在MORE选项卡视图控制器中,我实现了一个简单的表视图,显示了我在行中的所有其他选项卡。由于我希望能够将它们切换到我创建它们的tabbar中,就像我上面的resortslistviewcontroller一样(即:作为数组中的视图控制器)。当我将它们拉出来在tableview中显示标题时(所以用户可以转到那个“视图”)我只需执行以下操作:

    // [myGizmoClass CategoryArray] holds the array of view controller tab bar items that are NOT shown on the main screen.
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    ... etc...

        UIViewController *Uivc = [[myGizmoClass plusCategoryArray] objectAtIndex:indexPath.row];
        cell.textLabel.text = [Uivc title];
        cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
    }

这是它落在的地方:

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

    MyGizmoClass *myGizmoClass= [MyGizmoClass sharedManager];

    UIViewController *tbi = [[myGizmoClass plusCategoryArray] objectAtIndex:indexPath.row];
    NSLog(@"%@\n",[[tbi navigationItem ]title]);

    [self.navigationController pushViewController:tbi animated:YES];

}

这是我得到的错误(“ATMs”是点击的tableview单元格的标题)所以我知道Uivc标题正在拉出正确的标题,因此正确的“objectatindex”:

  

2010-04-09 11:25:48.222   MouseAddict [47485:207] ATMs 2010-04-09   11:25:48.222 MouseAddict [47485:207]   ***由于未捕获的异常而终止应用程序   'NSInvalidArgumentException',原因:   '推送导航控制器是   不支持'

大问题:如何制作UIViewController *tbi节目的关联视图并进入视图?

我希望UIViewController是这个tbl的正确类。我不确定。但我只是想获得视图,所以我可以把它推到堆栈上。

有人可以帮忙吗?

回答 kovpas 的问题如下:myGizmoClass是一个单例(apple的单例myGizmo类.ViewControllers数组存储在[localControllersArray addObject:localNavigationController];中(就在第一个中)上面的代码片段。并且它确实将它放入并正确地将其拉出来,这可以通过以下事实得到证明:当我在NSLOG时[Uivc title]日志打印ATMs。这意味着plusCategoryArray正确地存储和检索viewController(如果确实是存储的内容)。

Pushing a navigation controller is not supported真的很烦我。为什么viewController会返回navigationController,是否有可能强迫navigationController从中获取“可推送的”视图...或者navigationController是否有一些其中的元素是视图吗?

2 个答案:

答案 0 :(得分:4)

从错误中,看起来你的Gizmo类有一个UINavigationControllers数组,而不是UIViewControllers。所以改为推动:

[self.navigationController pushViewController:[[tbi viewControllers] lastObject] animated:YES];

如果数组与上面调用的localControllers数组相同,那么这应该更好。或者您可以在没有UINavigationControllers的情况下创建阵列,如果您要将它们推送到更多的控制器导航控制器上,则不需要它们。

答案 1 :(得分:1)

我不确定,但是当您尝试将UINavigationController推送到另一个UINavigationController时,看起来会出现此错误。你能提供MyGizmoClass的实现吗?