使用带有TabBarController的Delegate

时间:2012-04-22 17:43:02

标签: iphone objective-c ios

我有一个TabBarController,在启动时设置了多个ViewControllers。当用户单击按钮时,我想将它们发送到TabBarController中的另一个ViewController,并通过委托传递数据。

我有一个协议和委托设置。但是,何时设置委托,因为所有ViewControllers都在TabBarController

这是可能的,当用户单击按钮时,如何将数据传递到TabBar中的另一个ViewController。任何想法,我真的很想使用代表。

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

编辑:

所以假设我有一个带有两个ViewControllers的TabBarController,名为ViewControllerOne和ViewControllerTwo。

我将ViewControllerTwo设置为委托和协议。这是ViewController,它将在按下按钮后将数据发送到ViewControllerOne。 ViewControllerOne实现协议并包含方法setStringData,该方法应在按下ViewControllerTwo中的按钮后调用。

2 个答案:

答案 0 :(得分:0)

从UIViewController中,您想要更改选定的标签栏索引并传递数据。 我建议你在app appate中添加一个函数。 这样你的UIViewController就不会与UITabBar捆绑在一起(如果你明天要使用不同的UI惯用语,你只需要在你的app委托中更改你的函数的实现)。

要传递数据,我可以尝试在您的函数中进行内省:您获取新选择的选项卡索引的当前UIViewController,验证它是否响应您的选择器并调用该函数。

编辑:

让我们假设您的'just'必须更改所选的tabBar索引(例如,您的UIViewController在新标签栏索引上将始终相同)。

在您的第一个视图控制器中:

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

在你的Appdelegate:

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

在您的第二个视图控制器(您将到达的控制器)中:

    - (void)setStringData:(NSString *)data
    {
        // Do something...
    }

答案 1 :(得分:0)

我找到了解决问题的简单方法。在ViewControllerTwo中,我只是创建一个ViewControllerOne实例并将它传递给我需要的数据。然后我将tabBarController索引更改为ViewControllerOne。

例如:

// A method inside of ViewControllerTwo
ViewController *viewcontrollerOne = [ViewcontrollerOne alloc] init];
[viewcontrollerOne setStringData:str];
[viewcontrollerOne release];
self.tabBarController.selectedIndex = 0;