gpt4 book ai didi

iOS/Obj-C : Two MKMapViews, 一个 MapView 的注释没有执行?

转载 作者:行者123 更新时间:2023-11-29 00:17:24 25 4
gpt4 key购买 nike

我在一个 ViewController 中有两个独立的 map View 。每个 map View 显示一组不同的注释——一张 map 显示陌生人的位置,另一张 map 显示 friend 的位置。当我点击第一个 map View (mapView) 上的注释时,我会获得包含正确用户数据的详细 View 。但是,当我点击第二个 map View (friendsMapView) 上的注释时,将从填充第一个 map View 的字典中提取数据。记录错误后,我发现friendsMapView的didSelectAnnotation从未执行?我怎样才能解决这个问题?

代码未执行(编辑):

- (void)mapView:(MKMapView *)mapView didSelectAnnotationView:(MKAnnotationView *)view {

if (self.mapView == self.mapView) {
// Do something specific to self.mapView

PointAnnotation *selectedPoint = (PointAnnotation *) view.annotation;

UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main" bundle:nil];

OtherUserViewController *yourViewController = (OtherUserViewController *)[storyboard instantiateViewControllerWithIdentifier:@"OtherUserViewController"];

NSMutableDictionary *dictionary = self.addressData[selectedPoint.index];
yourViewController.mapuserData = dictionary;

[self.navigationController pushViewController:yourViewController animated:YES];


} else if (self.mapView == self.friendsMapView) {
// Do something specific to self.friendsMapView

PointAnnotation *selectedPoint = (PointAnnotation *) view.annotation;

UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main" bundle:nil];

OtherUserViewController *yourViewController = (OtherUserViewController *)[storyboard instantiateViewControllerWithIdentifier:@"OtherUserViewController"];

NSMutableDictionary *dictionary = self.friendData[selectedPoint.index];
yourViewController.mapuserData = dictionary;

[self.navigationController pushViewController:yourViewController animated:YES];

}



}

完整代码:MapViewController.m

- (void)mapView:(MKMapView *)mapView didUpdateUserLocation:(MKUserLocation *)userLocation
{

if (self.mapView == self.mapView) {

MKCoordinateRegion region = MKCoordinateRegionMakeWithDistance(userLocation.coordinate, 1300, 1300);
[self.mapView setRegion:[self.mapView regionThatFits:region] animated:YES];

} else if (self.mapView == self.friendsMapView) {

MKCoordinateRegion region = MKCoordinateRegionMakeWithDistance(userLocation.coordinate, 1300, 1300);
[self.friendsMapView setRegion:[self.friendsMapView regionThatFits:region] animated:YES];

}

}

- (NSString *)deviceLocation {
return [NSString stringWithFormat:@"latitude: %f longitude: %f", self.locationManager.location.coordinate.latitude, self.locationManager.location.coordinate.longitude];
}
- (NSString *)deviceLat {
return [NSString stringWithFormat:@"%f", self.locationManager.location.coordinate.latitude];
}
- (NSString *)deviceLon {
return [NSString stringWithFormat:@"%f", self.locationManager.location.coordinate.longitude];
}
- (NSString *)deviceAlt {
return [NSString stringWithFormat:@"%f", self.locationManager.location.altitude];
}

NSMutableDictionary *viewParams = [NSMutableDictionary new];
[viewParams setValue:@"u000" forKey:@"view_name"];
[DIOSView viewGet:viewParams success:^(AFHTTPRequestOperation *operation, id responseObject) {

self.addressData = [responseObject mutableCopy];


NSLog(@"%@", responseObject);


int index = 0; //Index to track the data source index while select the annotation call out view.

for (NSMutableDictionary *multiplelocations in self.addressData) {

NSString *location = multiplelocations[@"street_address"];
NSLog(@"Pull addresses %@", location);
NSString *userNames = multiplelocations[@"users_name"];
NSString *userBio = multiplelocations[@"userbio"];


CLGeocoder *geocoder = [[CLGeocoder alloc] init];

[geocoder geocodeAddressString:location
completionHandler:^(NSArray* placemarks, NSError* error){
if (placemarks && placemarks.count > 0) {
CLPlacemark *topResult = [placemarks objectAtIndex:0];
MKPlacemark *placemark = [[MKPlacemark alloc] initWithPlacemark:topResult];

MKCoordinateRegion region = self.mapView.region;

region.span.longitudeDelta /= 8.0;
region.span.latitudeDelta /= 8.0;


PointAnnotation *point = [[PointAnnotation alloc] init];
point.coordinate = placemark.coordinate;
point.title = userNames;
point.subtitle = userBio;
point.index = index; // Store index here.

[self.mapView addAnnotation:point];
}
}
];
index = index + 1;
}

} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
NSLog(@"Failure: %@", [error localizedDescription]);
}];





NSMutableDictionary *viewParamsFriend = [NSMutableDictionary new];
[viewParamsFriend setValue:@"accepted_friends" forKey:@"view_name"];
[DIOSView viewGet:viewParamsFriend success:^(AFHTTPRequestOperation *operation, id responseObject) {

self.friendData = [responseObject mutableCopy];


NSLog(@"THIS IS FRIEND DATA %@", self.friendData);

int index = 0;

for (NSMutableDictionary *multiplelocationsFriend in self.friendData) {


NSString *location = multiplelocationsFriend[@"address2"];
NSString *userNames = multiplelocationsFriend[@"node_title"];
NSString *userBio = multiplelocationsFriend[@"body"];


NSLog(@"LOCATION IS HERE %@", location);



CLGeocoder *geocoderFriend = [[CLGeocoder alloc] init];
[geocoderFriend geocodeAddressString:location
completionHandler:^(NSArray* placemarks, NSError* error){
if (placemarks && placemarks.count > 0) {
CLPlacemark *topResult = [placemarks objectAtIndex:0];
MKPlacemark *placemark = [[MKPlacemark alloc] initWithPlacemark:topResult];

MKCoordinateRegion region = self.friendsMapView.region;

region.span.longitudeDelta /= 8.0;
region.span.latitudeDelta /= 8.0;



PointAnnotation *point = [[PointAnnotation alloc] init];
point.coordinate = placemark.coordinate;
point.title = userNames;
point.subtitle = userBio;
point.index = index; // Store index here.

[self.friendsMapView addAnnotation:point];
}
}
];
index = index + 1;
}

} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
NSLog(@"Failure: %@", [error localizedDescription]);
}];


}

-(MKAnnotationView*)mapView:(MKMapView*)mapView viewForAnnotation:(id<MKAnnotation>)annotation {

MKAnnotationView *view = nil;
if (annotation != self.mapView.userLocation) {

view = [self.mapView dequeueReusableAnnotationViewWithIdentifier:@"myAnnotationIdentifier"];
if (!view) {

static NSString* AnnotationIdentifier = @"AnnotationIdentifier";

MKAnnotationView *annotationView = [[MKAnnotationView alloc] initWithAnnotation:annotation
reuseIdentifier:AnnotationIdentifier];
annotationView.canShowCallout = YES;
annotationView.image = [UIImage imageNamed:@"mappaw.png"];
UIButton* rightButton = [UIButton buttonWithType:UIButtonTypeDetailDisclosure];

annotationView.rightCalloutAccessoryView = rightButton;
annotationView.canShowCallout = YES;
annotationView.draggable = YES;
return annotationView;


}
}
return view;
}


- (void)mapView:(MKMapView *)mapView didSelectAnnotationView:(MKAnnotationView *)view {

PointAnnotation *selectedPoint = (PointAnnotation *) view.annotation;

UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main" bundle:nil];

OtherUserViewController *yourViewController = (OtherUserViewController *)[storyboard instantiateViewControllerWithIdentifier:@"OtherUserViewController"];

NSMutableDictionary *dictionary = self.addressData[selectedPoint.index];
yourViewController.mapuserData = dictionary;

[self.navigationController pushViewController:yourViewController animated:YES];

}


-(MKAnnotationView*)friendsMapView:(MKMapView*)friendsMapView viewForAnnotation:(id<MKAnnotation>)annotation {
// If you are showing the users location on the map you don't want to change it
MKAnnotationView *view2 = nil;
if (annotation != self.friendsMapView.userLocation) {

view2 = [self.friendsMapView dequeueReusableAnnotationViewWithIdentifier:@"myFriendAnnotationIdentifier"];
if (!view2) {

static NSString *AnnotationIdentifier = @"FriendAnnotationIdentifier";

MKAnnotationView *annotationView = [[MKAnnotationView alloc] initWithAnnotation:annotation
reuseIdentifier:AnnotationIdentifier];
annotationView.canShowCallout = YES;
annotationView.image = [UIImage imageNamed:@"mappaw.png"];
UIButton* rightButton = [UIButton buttonWithType:UIButtonTypeDetailDisclosure];

annotationView.rightCalloutAccessoryView = rightButton;
annotationView.canShowCallout = YES;
annotationView.draggable = YES;
return annotationView;


}
}
return view2;
}

- (void)friendsMapView:(MKMapView *)friendsMapView didSelectAnnotationView:(MKAnnotationView *)view2
{

PointAnnotation *selectedPoint = (PointAnnotation *) view2.annotation;

UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main" bundle:nil];

OtherUserViewController *yourViewController = (OtherUserViewController *)[storyboard instantiateViewControllerWithIdentifier:@"OtherUserViewController"];

NSMutableDictionary *dictionary = self.friendData[selectedPoint.index];

yourViewController.mapuserData = dictionary;

[self.navigationController pushViewController:yourViewController animated:YES];

NSLog(@"Selected!");


}

最佳答案

您不能为委托(delegate)方法构造方法签名。

下列说法正确的是:

- (void)mapView:(MKMapView *)mapView didUpdateUserLocation:(MKUserLocation *)userLocation

以下是一些永远不会被视为委托(delegate)方法的虚构方法:

- (void)friendsMapView:(MKMapView *)friendsMapView didUpdateUserLocation:(MKUserLocation *)userLocation

只需实现适当的委托(delegate)方法。两个 map View 将使用相同的委托(delegate)方法。您可以使用 mapView 参数进行相应操作。

例如,您的两个 didUpdateUserLocation 委托(delegate)方法变成一个,如下所示:

- (void)mapView:(MKMapView *)mapView didUpdateUserLocation:(MKUserLocation *)userLocation
{
MKCoordinateRegion region = MKCoordinateRegionMakeWithDistance(userLocation.coordinate, 1300, 1300);
[mapView setRegion:[mapView regionThatFits:region] animated:YES];
}

一个委托(delegate)方法将适用于两个 map View 。

如果您确实需要根据 map View 执行不同的操作,您可以执行如下操作:

- (void)mapView:(MKMapView *)mapView didUpdateUserLocation:(MKUserLocation *)userLocation
{
if mapView == self.mapView {
// Do something specific to self.mapView
} else if mapView == self.friendsMapView {
// Do something specific to self.friendsMapView
}
}

关于iOS/Obj-C : Two MKMapViews, 一个 MapView 的注释没有执行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44975769/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com