在选项卡栏控制器项目中的 2 个视图控制器之间进行通信



我在我的项目中使用标签栏控制器,其中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];
}

最新更新