我现在想弄清楚,我应该如何使用注释按钮进行切换 到另一个mapView。我正在使用的应用程序使用MapBox - maps。我查了一下这个例子 由他们提供,但在两个地图之间以编程方式切换总是实现 通过标签栏(我不想使用的情况)。 我正在使用故事板,我理解它很好,如何制作segue 在界面构建器中,但我认为我没有使用以编程方式集成 地图视图上的按钮。我在两个头文件中启动了'id',并且我在其中宣布了它们 Identity Inspector也是。
这是代码的一部分,我在其中实现带有注释的RMMMapView 主视图控制器 - ViewController,它运行良好:
- (void)viewDidLoad{
[super viewDidLoad];
RMMapBoxSource *onlineSource = [[RMMapBoxSource alloc] initWithMapID:(([[UIScreen mainScreen] scale] > 1.0) ? kRetinaMapID : kNormalMapID)];
_mapView = [[RMMapView alloc] initWithFrame:self.view.bounds andTilesource:onlineSource];
_mapView.tileSource = [[RMMapBoxSource alloc] initWithMapID:(([[UIScreen mainScreen] scale] > 1.0) ? kRetinaMapID : kNormalMapID)];
_mapView.centerCoordinate = CLLocationCoordinate2DMake(0,0);
_mapView.adjustTilesForRetinaDisplay = YES;
_mapView.zoom = 4;
_mapView.autoresizingMask = UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleWidth;
[self.view addSubview:_mapView];
_mapView.showsUserLocation = YES;
[_mapView setConstraintsSouthWest:[_mapView.tileSource latitudeLongitudeBoundingBox].southWest
northEast:[_mapView.tileSource latitudeLongitudeBoundingBox].northEast];
RMPointAnnotation *annotation = [[RMPointAnnotation alloc] initWithMapView:_mapView
coordinate:_mapView.centerCoordinate andTitle:@"Hello, world!"];
[_mapView addAnnotation:annotation];
}
这是我尝试从ViewController调用LowContentMap viewController的部分 - 主ViewController:
- (void) prepareForSegue:(UIStoryboardSegue *) segue sender:(id) sender {
if ([segue.identifier isEqualToString:@"Hello, world!"]) {
//LowContentMap *lowContentMap = segue.destinationViewController;
UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:[NSBundle mainBundle]];
LowContentMap *lowContentMap = [storyboard instantiateViewControllerWithIdentifier:@"lowContentMap"];
lowContentMap.lcm = _vc;
}}
这是代码的一部分,应填写:
- (void)mapView:(RMMapView *)mapView annotationView:(RMPointAnnotation *)annotation calloutAccessoryControlTapped:(UIControl *)control{
[self performSegueWithIdentifier:@"ShowSomeViewController" sender:annotation];
}
如果有人试图解决这个问题,那真的很棒。 我跟随Noa和Kronos之间的分歧: Setting up a detail view controller using a segue 但我仍然认为,带有'id'的部分是我做错了。提前谢谢。
答案 0 :(得分:0)
您应该阅读“View Controller Programming Guide”,特别是“从其他视图控制器呈现视图控制器”部分
我还建议查看一些展示如何使用ViewControllers的精彩WWDC视频。
有很多方法可以做到这一点。例如。使用storyboard创建和显示viewController,在子控制器中定义一个协议,覆盖“performSegueWithIdentifier”来设置委托并实现协议以解除vc。
但是,在您的情况下,以编程方式执行此操作似乎是有意义的。因此,您需要:
a)找到添加行动的正确位置
b)分配并初始化您的视图控制器:
MyController *myController = [[MyController alloc] init];
// setup as required, there should be at least a delegate (being able to dismiss the view)
myController.delegate = self;
如果您在故事板中设计了viewController,则可能需要使用此alloc / init例程:
MyController *myController = [[UIStoryboard storyboardWithName:@"Main.storyboard" bundle:nil] instantiateViewControllerWithIdentifier:@"MyController"];
myController.delegate = self;
c)显示新的视图控制器; 这取决于你是否有一个navigationController:
[self.navigationController pushViewController:myController animated:YES];
...或者如果你想以模态方式呈现它:
[self presentViewController:myController animated:YES completion:NULL];
d)完成后解雇; 当你的另一个控制器完成它所做的任何事情时,它应该通知它的代表(实现你自己的协议!)它已经完成并且应该被解雇。委托是原始的viewController,它创建(alloc'd / inited)“myController”:
// this method should be defined in a protocol and implemented in the vc that created (and owns) the child view controller
// typically, this is the parent view controller
- (void)done {
[self dismissViewControllerAnimated:YES completion:NULL];
}
如果您使用了navigationController,那么它不是-dismissViewControllerAnimated:,而是
[self.navigationController popViewControllerAnimated:YES];
希望这有助于澄清事情