Iphone 使用带有TabBarController的委托

Iphone 使用带有TabBarController的委托,iphone,objective-c,ios,Iphone,Objective C,Ios,我有一个TabBarController,它在启动时设置了多个ViewController。当用户单击某个按钮时,我希望将它们发送到TabBarController中的另一个ViewController,并通过代理传递数据 - (IBAction)sendData:(id)sender { [self.delegate setStringData:strData]; self.tabBarController.selectedIndex = 0; } 我有一个协议和代表设置。但

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

- (IBAction)sendData:(id)sender
{
    [self.delegate setStringData:strData];
    self.tabBarController.selectedIndex = 0;
}
我有一个协议和代表设置。但是,由于所有ViewController都在TabBarController中,因此何时设置代理

如果可能,当用户单击按钮时,如何将数据传递到选项卡栏中的另一个ViewController。任何想法,我真的想用一个代表

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

假设我有一个TabBarController,它有两个名为ViewControllerOne和ViewControllerTwo的ViewController


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

您要从UIViewController更改选定的选项卡栏索引并传递数据。 我建议您为此在应用程序代理中添加一个函数。 这样,您的UIViewController就不会与UIAbbar绑定。如果明天您想使用不同的UI习惯用法,您只需更改应用程序委托中的函数实现

- (IBAction)sendData:(id)sender
{
    [self.delegate setStringData:strData];
    self.tabBarController.selectedIndex = 0;
}
要传递数据,您可以尝试在函数中进行内省:获取新选定选项卡索引的当前UIViewController,验证它是否响应选择器并调用函数

编辑:

假设您的“只是”必须更改选定的选项卡栏索引,例如,您的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... }
我找到了解决我问题的更简单的办法。在ViewControllerTwo内部,我只是创建了一个ViewControllerOne实例,并将我需要的数据传递给它。然后我将tabBarController索引更改为ViewControllerOne

例如:

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

请使用一些主题。。。哪个类应该是委托?它应该在哪一类中使用?您将从一个viewController转到另一个。。。那么?我会修改一下,让它更清楚一点。我不确定我是否完全理解这个答案。那么这个方法在AppDelegate中?现在没有代理和协议?假设我不会改变我的UI习惯用法,你能简化它吗?以及setStringData方法,它将位于何处?你需要将此代码放在选项卡栏控制器中,并在视图控制器中实现这些方法。我编辑了我的回复,以向你展示完整的实现。正如我所说的,我假设在新选择的选项卡栏索引中始终有相同的UIViewController子类。我想从ViewControllerTwo向ViewControllerOne提出另一个问题,因此我将在ViewControllerOne中调用setStringData,并在ViewControllerTwo中调用sendData。这是对的还是我错了?