在标签栏控制器项目中的2个ViewControllers之间进行通信

时间:2013-09-07 13:55:54

标签: ios objective-c uitabbarcontroller ios7 tabbarcontroller

我在我的项目中使用Tab Bar Controller,其中FirstViewController具有Mapbox地图视图,而SecondViewController具有按下按钮,按下时会向地图视图添加切片图层。这是我尝试过的。它会产生错误***使用未声明的标识符' _mapView'在SecondViewController.m

//FirstViewController.h

#import <UIKit/UIKit.h>
#import <MapBox/MapBox.h>
#import "SecondViewController.h"
#import "SecondViewController.m"

@interface FirstViewController : UIViewController


@property (strong, nonatomic) IBOutlet RMMapView *mapView;


@end


//SecondViewController.h

#import <UIKit/UIKit.h>
#import <MapBox/MapBox.h>
#import "FirstViewController.h"
#import "FirstViewController.m"


@interface SecondViewController : UIViewController

- (IBAction)stationingLayerButton:(id)sender;

@end


//SecondViewController.m

- (IBAction)stationingLayerButton:(id)sender {

RMMBTilesSource *stationingMap = [[RMMBTilesSource alloc] initWithTileSetURL:[NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:@"Stationing20" ofType:@"mbtiles"]]];


[_mapView addTileSource:stationingMap atIndex:2]; 

 }
}

地图调用是正确的,因为我在仅使用一个视图控制器的项目上测试了它。现在,我在Tab Bar Controller上尝试它,我得到了这个错误。

我的问题是

1.如何在FirstViewController中获取mapView以响应SecondViewController中的调用? 这可以吗?我已经导入了类文件,认为这会打开两者之间的通信,但我仍然坚持这个错误。

3 个答案:

答案 0 :(得分:16)

使用tabbar控制器,您可以在所有关联的视图控制器上获取阵列。

您可以在此处找到更多详细信息:UITabbarController - viewControllers property

例如:

在标签栏中,如果我们有两个视图控制器,假设 VC1和VC2 ,那么我们可以使用下面的代码段来获得这些参考中的任何一个。

VC2 类实现中访问 VC1 引用(VC2.m)

VC1 *myVC1ref = (VC1 *)[self.tabBarController.viewControllers objectAtIndex:0];

现在我们可以使用 VC1 类的公共属性和方法,它将提供tabbar加载的相同引用。

希望这有帮助。

答案 1 :(得分:1)

您基本上将视图控制器添加到UITabBarController。因此,如果您需要访问特定标签中的UIViewControler,则需要查询UITabBarController。以下回答SO问题可能对您有所帮助

any code example of how access viewcontroller from uitabbarcontroller?

掌握视图控制器后,您可以传递所需的所有数据。

答案 2 :(得分:1)

感谢Mrunal和Naz Mir。

我添加了一个UITabBarController类文件并将其分配给我的TabBarController。我然后NSLog TabBarController的视图控制器的数组描述。

//TabBarController.h

@property (strong, nonatomic) NSArray *array;

//TabBarController.m

- (void)viewDidLoad
{

NSArray *array = self.viewControllers;

NSLog(@"View Controllers = %@", [array description]);

}

然后我将FirstViewController.h导入SecondViewController.h并在SecondViewController.m中写了...

//SecondViewController.m

- (IBAction)stationingLayerButton:(id)sender {


FirstViewController *FVC = [self.tabBarController.viewControllers objectAtIndex:0];


[[FVC mapView] addTileSource:stationingMap atIndex:2];

}