我有一个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中的按钮后调用。
答案 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;