6

プロジェクトでタブ バー コントローラーを使用しています。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 つのビュー コントローラーのみを使用するプロジェクトでテストしたので、マップ呼び出しは正しいです。Tab Bar Controller で試してみると、このエラーが発生します。

私の質問は

1. FirstViewController で mapView を取得して、SecondViewController での呼び出しに応答するにはどうすればよいですか? 2.これはできますか?これにより2つの間の通信が開かれると考えてクラスファイルをインポートしましたが、このエラーで立ち往生しています。

4

3 に答える 3

16

タブバーコントローラーを使用すると、関連するすべてのビューコントローラーで配列を取得できます。

詳細はこちら: UITabbarController - viewControllers プロパティ

例えば ​​:

タブバーに、たとえばVC1 と VC2という 2 つのビュー コントローラーがある場合、以下のコード スニペットを使用して、これらの参照のいずれかを取得できます。

VC2クラス実装(VC2.m)でVC1参照にアクセスする:

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

これで、 VC1クラスのパブリック プロパティとメソッドを使用できるようになり、タブバーがロードしたのと同じ参照が提供されます。

お役に立てれば。

于 2013-09-07T14:08:45.943 に答える
1

Mrunal と Naz Mir に感謝します。

UITabBarController クラス ファイルを追加し、TabBarController に割り当てました。次に、TabBarController のビュー コントローラーの配列の説明を NSLog します。

//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];

}
于 2013-09-07T16:30:28.873 に答える
1

基本的に、View Controller を に追加しますUITabBarControllerUIViewControlerそのため、特定のタブでにアクセスする必要がある場合は、にクエリを実行する必要がありますUITabBarController。次の回答済みの SO の質問が役立つ場合があります

uitabbarcontroller から viewcontroller にアクセスする方法のコード例はありますか?

ビュー コントローラーを取得したら、必要なすべてのデータを渡すことができます。

于 2013-09-07T14:08:18.650 に答える