修改父视图控制器中的选项卡栏项

时间:2012-05-01 19:27:26

标签: ios ios5 uitabbarcontroller xcode4.2

是否可以在prepareForSegue期间修改父视图控制器中的标签栏项?基本上,我正在尝试在父控制器中插入逻辑,其中可以在segue上删除2个可能的标签栏项目之一。

我尝试过以下方面:

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    if ([segue.identifier isEqualToString:@"identifierOfInterest"]) {
        UITabBarController *tabBarController = (UITabBarController *)segue.destinationViewController;

        // Attempt 1
        NSMutableArray *items = [[tabBarController.tabBar items] mutableCopy];
        [items removeObjectAtIndex:1];
        [tabBarController.tabBar setItems:items animated:YES];

        // Attempt 2
        NSMutableArray *items = [[tabBarController viewControllers] mutableCopy];
        [items removeObjectAtIndex:1];
        [tabBarController setViewControllers:items];
    }
}

不幸的是,这两条消息都会使应用程序崩溃并出现以下错误:

尝试1:

Directly modifying a tab bar managed by a tab bar controller is not allowed.

尝试2:

[UITabBarItem parentViewController]: unrecognized selector sent to instance

我正在使用Xcode 4.2,iOS 5,其中UI标签栏控制器是一个故事板对象,因此标签栏或任何东西都没有出口。

提前致谢!

1 个答案:

答案 0 :(得分:0)

通常在TabBar应用程序中,AppDelegate拥有(或引用)标签栏控制器,因为它是“主”视图控制器。你不能隔离到标签栏视图控制器,或者至少你不应该。如果您需要让应用程序的标签栏控制器执行某些操作,请向App Delegate实例发送一条消息,该实例应该具有对标签栏控制器的引用,以执行该工作。

即。

//In View Controller handling seque
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    [[[UIApplication sharedApplication] delegate] performSelector:@selector(doTabBarWork:) withObject:data];
}

//In the App delegate
-(void)doTabBarWork:(id)data
{
    //The "mainTabBarController" instance needs to already be set
    NSMutableArray *viewControllers =  [[self.mainTabBarController viewControllers] mutableCopy];
    [viewControllers removeLastObject];
    [self.mainTabBarController setViewControllers:viewControllers animated:YES];
}