0

prepareForSegue中に親View Controllerのタブバー項目を変更することは可能ですか? 基本的に、セグエ時に2つの可能なタブバーアイテムの1つが削除される親コントローラーにロジックを挿入しようとしています。

私は次の行に沿って何かを試しました:

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

UI Tab Bar Controller がストーリーボード オブジェクトである iOS 5 の Xcode 4.2 を使用しているため、タブ バーなどへのアウトレットはありません。

前もって感謝します!

4

1 に答える 1

0

通常、TabBar アプリケーションでは、AppDelegate がタブ バー コントローラーを所有 (または参照) します。これは、それが "メイン" ビュー コントローラーであるためです。タブ バーのビュー コントローラーにシークすることはできません。少なくともそうすべきではありません。アプリケーションのタブ バー コントローラーに何らかのアクションを実行させる必要がある場合は、アプリ デリゲート インスタンスにメッセージを送信します。これには、タブ バー コントローラーへの参照が必要であり、作業を実行します。

すなわち

//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];
}
于 2012-09-05T17:41:09.427 に答える