0

起動時に複数のViewControllerで設定されたTabBarControllerがあります。ユーザーがボタンをクリックすると、それらを TabBarController の別の ViewController に送信し、デリゲートを介してデータを渡します。

プロトコルとデリゲートをセットアップしました。ただし、すべてのViewControllerがTabBarControllerにあるため、いつデリゲートを設定しますか

これは可能ですか、ユーザーがボタンをクリックしたときに TabBar の別の ViewController にデータを渡すにはどうすればよいですか。どんなアイデアでも、デリゲートを使用したいと思います。

- (IBAction)sendData:(id)sender
{
    [self.delegate setStringData:strData];
    self.tabBarController.selectedIndex = 0;
}

編集:

では、ViewControllerOne と ViewControllerTwo という 2 つの ViewController を持つ TabBarController があるとします。

ViewControllerTwo をデリゲートとプロトコルとして設定しました。これは、ボタンが押された後に ViewControllerOne にデータを送信する ViewController です。ViewControllerOne はプロトコルを実装し、ViewControllerTwo のボタンが押された後に呼び出されるメソッド setStringData を含みます。

4

2 に答える 2

0

UIViewController から、選択したタブ バーのインデックスを変更してデータを渡します。このためにアプリデリゲートに関数を追加することをお勧めします。そうすれば、UIViewController は UITabBar に関連付けられません (明日別の UI イディオムを使用する場合は、アプリ デリゲートで関数の実装を変更するだけで済みます)。

データを渡すには、関数でイントロスペクションを試みることができます。新しく選択したタブ インデックスの現在の UIViewController を取得し、それがセレクターに応答することを確認して、関数を呼び出します。

編集 :

選択したタブバーのインデックスを「ただ」変更する必要があると仮定しましょう (たとえば、UIViewController は新しいタブバーのインデックスで常に同じになります)。

最初の View Controller で:

    - (IBAction)sendData:(id)送信者
    {
        UIApplicationDelegate * appDelegate = [[UIApplication sharedApplication] delegate];
        if ([appDelegate RespondToSelector:@selector(goToFirstTabBarWithData:)])
        {
            [appDelegate performSelector:@selector(goToFirstTabBarWithData:) withObject: strData];
        }
    }

あなたの Appdelegate で:

    - (void)goToFirstTabBarWithData:(NSString *)データ
    {
        self.tabBarController.selectedIndex = 0;
        UIViewController * vc = [self.tabBarController.viewControllers objectAtIndex:0];
        if ([vc RespondToSelector:@selector(setStringData:)])
        {
            [vc performSelector:@selector(setStringData:) withObject:data];
        }
    }

2 番目のビュー コントローラー (到着するコントローラー) で:

    - (void)setStringData:(NSString *)データ
    {
        // 何かをする...
    }
于 2012-04-22T18:03:39.500 に答える
0

私の問題に対するより簡単な解決策を見つけました。ViewControllerTwo の内部では、ViewControllerOne のインスタンスを作成し、必要なデータを渡します。次に、tabBarController インデックスを ViewControllerOne に変更します。

例えば:

// A method inside of ViewControllerTwo
ViewController *viewcontrollerOne = [ViewcontrollerOne alloc] init];
[viewcontrollerOne setStringData:str];
[viewcontrollerOne release];
self.tabBarController.selectedIndex = 0;  
于 2012-04-24T00:42:46.173 に答える