我在我的项目中使用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中的调用? 这可以吗?我已经导入了类文件,认为这会打开两者之间的通信,但我仍然坚持这个错误。
答案 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];
}