我在我的项目中使用标签栏控制器,其中FirstViewController具有Mapbox地图视图,而SecondViewController具有按钮,按下时可将切片图层添加到地图视图。这是我尝试过的。它创建错误 ****在 SecondViewController.m 中使用未声明的标识符"_mapView"
//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];
}
}
地图调用是正确的,因为我已经在仅使用一个视图控制器的项目中对其进行了测试。现在我在标签栏控制器上尝试它,我收到此错误。
我的问题是
1.如何让第一视图控制器中的地图视图响应第二视图控制器中的调用?2.可以做到吗?我已经导入了类文件,认为这将打开两者之间的通信,但我遇到了这个错误。
使用选项卡栏控制器,您可以在所有关联的视图控制器上获取数组。
您可以在此处找到更多详细信息:UITabbarController - viewControllers 属性
例如:
在标签栏中,如果我们有两个视图控制器,比如 VC1 和 VC2,那么我们可以使用以下代码片段来获得这些引用中的任何一个。
在 VC2类实现中访问 VC1 引用 (VC2.m):
VC1 *myVC1ref = (VC1 *)[self.tabBarController.viewControllers objectAtIndex:0];
现在我们可以使用 VC1 类的公共属性和方法,它将提供与选项卡栏加载的相同引用。
希望这有帮助。
基本上是将视图控制器添加到UITabBarController
。因此,如果您需要访问特定选项卡中的UIViewControler
,则需要查询UITabBarController
。以下回答的SO问题可能会对您有所帮助
如何从uitabbarcontroller访问ViewController的任何代码示例?
一旦你掌握了视图控制器,你就可以传递你想要的所有数据。
感谢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];
}