菜鸟教程小白 发表于 2022-12-11 18:08:49

ios - 当我搜索一个地方时,它会丢弃一个 pin mapView


                                            <p><p>我遇到了 <code>mapView</code> 的问题。很抱歉提出这个问题,但我已经搜索了将近一天来研究这个问题,但我没有找到解决它的方法。</p>

<p> <img src="/image/Z8Gnt.png" alt="When I am searching a place it drops a pin, how can I remove them ?"/> </p>

<pre><code>@interface MapViewController ()&lt;CLLocationManagerDelegate, MKMapViewDelegate, UITextFieldDelegate, CheckInDelegate, NotificationsViewControllerDelegate, ReportVCDelegate, TutorialViewControllerDelegate&gt; {
    CLLocationManager *locationManager;

    NSTimer *refreshTimer;
    int rangeValue;
    CheckInViewController *checkInVC;
    TutorialViewController *tutorialVC1;
    TutorialViewController *tutorialVC2;
    UIImageView *imgAvatar;

    NSArray *markers;
}

@property (weak, nonatomic) IBOutlet UIView *viewSearch;
@property (weak, nonatomic) IBOutlet RateView *viewRate;
@property (weak, nonatomic) IBOutlet UIView *viewBottom;
@property (weak, nonatomic) IBOutlet UILabel *lblUsername;
@property (weak, nonatomic) IBOutlet UITextField *txtSearch;
@property (weak, nonatomic) IBOutlet UIBarButtonItem *btnNotifications;
@property (weak, nonatomic) IBOutlet NSLayoutConstraint *bottomSpace;
@property (weak, nonatomic) IBOutlet NSLayoutConstraint *bottomHeight;
@property (weak, nonatomic) IBOutlet UIButton *btnBottom;
@property (weak, nonatomic) IBOutlet HandsawayMapView *mapView;
@property (weak, nonatomic) IBOutlet UIView *mapViewContainer;

@property (strong, nonatomic) MKPlacemark *searchMarker;
@property (strong, nonatomic) MKUserLocation *myMarker;
@property (weak, nonatomic) MapToolbarViewController *mapToolbar;

@property (strong, atomic) NSArray *allMapMarkers;
@property (strong, nonatomic) NSNumber *aggressionIdToCenter;

@end

@implementation MapViewController

- (void)viewDidLoad {
    ;
    // Do any additional setup after loading the view.

//    [ setUserHome:@(1)];

    rangeValue = 300;

    self.viewSearch.layer.masksToBounds = NO;
    self.viewSearch.layer.shadowRadius = 0.5f;
    self.viewSearch.layer.shadowColor = .CGColor;
    self.viewSearch.layer.shadowOffset = CGSizeMake(0.0f, 0.5f);
    self.viewSearch.layer.shadowOpacity = 0.5f;

    self.viewRate.starCount = 4;
    self.viewRate.step = 1.0f;
    self.viewRate.starNormalColor = UIColorFromRGB(0xD8D8D8);
    self.viewRate.starFillColor = UIColorFromRGB(0xFF5B59);
    self.viewRate.rating = 3.0f;
    self.viewRate.starSize = 20.0f;
    self.viewRate.padding = 8.0f;

    locationManager = [ init];
    ;
    locationManager.delegate = self;

    ;

    imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal]];
    }];
}

- (void)viewDidAppear:(BOOL)animated {
    ;

    NSNumber *agressionID = [ valueForKey:@&#34;aggression_id&#34;];
    if (agressionID &amp;&amp; agressionID != 0)
    {
      self.aggressionIdToCenter = agressionID;
      [ setValue:0 forKey:@&#34;aggression_id&#34;];
      [ synchronize];
    }

    if (self.aggressionIdToCenter != nil) {
      ;
      self.aggressionIdToCenter = nil;
    }
}

- (void)viewWillDisappear:(BOOL)animated {
    ;

    ;
    didSetLocation = NO;
}

- (void)didReceiveMemoryWarning {
    ;
    // Dispose of any resources that can be recreated.
}



- (UIView*)locationPin {
    User *user = ;
    UIImage *pin = ;
    if() {
      pin = ;
    }
    UIImageView *pinImageView = [ initWithFrame:CGRectMake(0, 0, 39, 48)];
    ;
    UIView *markerContainer = [ initWithFrame:CGRectMake(0, 0, 39, 48)];
    ;
    imgAvatar = [ initWithFrame:CGRectMake(4.5, 4.5, 30, 30)];
    ;
    imgAvatar.layer.cornerRadius = 15;
    imgAvatar.clipsToBounds = YES;
    ;
    if() {
      ];
    }
    else {
       placeholderImage:];
    }
    ];
    ];
    ];
    return markerContainer;
}

- (void)ckeckUserImage
{
    User *user = ;
    if() {
      ];
    }
    else {
       placeholderImage:];
    }

    if (self.mapToolbar.currentUser)
    {
      ;
    }
}

#pragma mark - Navigation

// In a storyboard-based application, you will often want to do a little preparation before navigation
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
// Get the new view controller using .
// Pass the selected object to the new view controller.
   if() {
         self.mapToolbar = segue.destinationViewController;
         self.mapToolbar.height = self.bottomHeight;
         self.mapToolbar.masterVC = self;
   } else if ( &amp;&amp; ]) {
         NotificationsViewController *destination = (NotificationsViewController *)segue.destinationViewController;
         destination.delegate = self;
   }
   else if() {
         self.VCactionSheetMap = segue.destinationViewController;
         self.VCactionSheetMap.delegate = self.mapToolbar;
   } else if () {
         self.reportVC = (ReportVC *)segue.destinationViewController;
         self.reportVC.delegate = self;
   }
}


- (IBAction)onMenu:(id)sender {
    ;
}

-(IBAction)onLocate:(id)sender {
    self.txtSearch.text = @&#34;&#34;;
    ;
    self.searchMarker = nil;
    didSetLocation = NO;
}

- (IBAction)onCheckIn:(id)sender {
    if([ valueForKey:@&#34;tutorials2&#34;]) {
      self.btnCheckin.hidden = YES;

      checkInVC = ;
      checkInVC.delegate = self;
      checkInVC.model = [ init];

      if(_searchMarker != nil) {
            checkInVC.model.longitude = (double) _searchMarker.coordinate.longitude;
            checkInVC.model.latitude = (double) _searchMarker.coordinate.latitude;
      }
      else {
            checkInVC.model.longitude = (double) locationManager.location.coordinate.longitude;
            checkInVC.model.latitude = (double) locationManager.location.coordinate.latitude;
      }
      if(]) {
            checkInVC.agressionId = sender;
      }
      UIWindow *currentWindow = .keyWindow;
      ;
    }
    else {
      static dispatch_once_t onceToken;
      dispatch_once(&amp;onceToken, ^{
            if(![ valueForKey:@&#34;tutorials2&#34;]) {
                ;
                ;
                ;
                UIStoryboard *tutorials = ;
                tutorialVC2 = (TutorialViewController *)];
                tutorialVC2.delegate = self;
                [ setFrame:self.view.bounds];
                belowSubview:self.btnCheckin];

                [ setValue:@YES forKey:@&#34;tutorials2&#34;];
            }
      });
    }
}

- (IBAction)onNotifications:(id)sender {
    if([ valueForKey:@&#34;tutorials1&#34;]) {
      ;
    }
    else {
      static dispatch_once_t onceToken;
      dispatch_once(&amp;onceToken, ^{static dispatch_once_t onceToken;
            dispatch_once(&amp;onceToken, ^{
                if(![ valueForKey:@&#34;tutorials1&#34;]) {
                  ;
                  UIStoryboard *tutorials = ;
                  tutorialVC1 = (TutorialViewController *)];
                  tutorialVC1.delegate = self;

                  [ setFrame:self.view.bounds];
                  ];


                  [ setValue:@YES forKey:@&#34;tutorials1&#34;];
                }
            });
      });
    }
}

- (void)locationManager:(CLLocationManager *)manager didChangeAuthorizationStatus:(CLAuthorizationStatus)status {
    ;
}

BOOL didSetLocation;

- (void)locationManager:(CLLocationManager *)manager
   didUpdateLocations:(NSArray&lt;CLLocation *&gt; *)locations {
    if(locations.count &gt; 0 ) {
      CLLocation *aUserLocation = locations;

      self.myMarker.coordinate = aUserLocation.coordinate;
//      if(_myMarker == nil) {
//            GMSMarker *marker = [ init];
//            marker.iconView = [ locationPin];
//            marker.map = mapView_;
//            _myMarker = marker;
//      }
//      _myMarker.position = aUserLocation.coordinate;

      if(!didSetLocation) {

            didSetLocation = YES;
            MKCoordinateRegion region;
            MKCoordinateSpan span;
            span.latitudeDelta = 0.01557113906538632;
            span.longitudeDelta = 0.02284631241712987;
            CLLocationCoordinate2D location;
            location.latitude = aUserLocation.coordinate.latitude;
            location.longitude = aUserLocation.coordinate.longitude;
            region.span = span;
            region.center = location;

            ;

//            [APICLIENT locateUserWithCoordinates:location
//                                    completion:^(NSDictionary *result) {
//                                          
//                                    } error:^{
//                                          
//                                    }];
      }
    }
}

#pragma mark - Bottom bar

BOOL isBottomBarShown = YES;

}


#pragma mark - MKMapViewDelegate

- (void)mapView:(MKMapView *)mapView regionWillChangeAnimated:(BOOL)animated {
    //    NSLog(@&#34;longitured : %@, lattitude: %@&#34;, @(mapView.region.span.longitudeDelta), @(mapView.region.span.latitudeDelta));
    ;
    ;

    refreshTimer = [NSTimer scheduledTimerWithTimeInterval:0.8
                                                    target:self
                                                selector:@selector(refreshMapMarkersWithCoordinates:)
                                                userInfo:@{@&#34;longitude&#34; : @(mapView.region.center.longitude), @&#34;latitude&#34; : @(mapView.region.center.latitude), @&#34;range&#34; : @(rangeValue)}
                                                   repeats:NO];
}


- (nullable MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id &lt;MKAnnotation&gt;)annotation {
    if(!]) {
      MKAnnotationView * annotationView = ;
      if(]) {
            UIView *userView = ;
            ;
            ;

            self.myMarker = annotation;

            ;
      }
      else {

            annotationView.annotation = annotation;
            Marker *dbmarker = ((MarkerAnnotation*)annotation).userData;

            if(dbmarker.agression != nil) {
                ];

                ;
            }
            else if(dbmarker.user != nil) {
                UIView *userView = ;
                ;
                ;

                ;
            }
      }

      return annotationView;
    }

    return nil;
}

- (void)mapView:(MKMapView *)mapView didSelectAnnotationView:(MKAnnotationView *)view {
    if(view.annotation != self.searchMarker &amp;&amp; view.annotation != self.myMarker) {
      if(]) {

      }
      else {
            ;
      }
    }
    else
    {
      if (view.annotation == self.myMarker)
      {
            ;
      }
      ;
    }
}

- (void)mapView:(MKMapView *)mapView didDeselectAnnotationView:(MKAnnotationView *)view {
    if(view.annotation != self.searchMarker &amp;&amp; view.annotation != self.myMarker) {
      if(]) {

      }
      else {
            ;
      }
    }
}

- (void)mapView:(MKMapView *)mapView didUpdateUserLocation:(MKUserLocation *)userLocation {
    [APICLIENT locateUserWithCoordinates:userLocation.location.coordinate
                              completion:^(NSDictionary *result) {

                              } error:^{

                              }];
}

#pragma mark - GMSMap delegate

//- (BOOL)mapView:(GMSMapView *)mapView didTapMarker:(GMSMarker *)marker {
//    ;
//    return YES;
//}

- (void)selectMarker:(Marker *)marker {
    Marker *dbMarker = marker;

    if(dbMarker.agression != nil) {
      [APICLIENT getAgressionWithId:dbMarker.agression.webID
                           completion:^(Marker *newmarker) {
                              
                                           completion:^(User *result) {
                                             self.mapToolbar.marker = newmarker;
                                             //;
                                           } error:^{

                                           }];
                           } error:^{

                           }];
    }
    else {
      
                  completion:^(User *result) {
                        self.mapToolbar.marker = dbMarker;
                        ;
                  } error:^{

                  }];
    }
}



-(void)reloadMarkers {
    [APICLIENT getMapMarkersAroundMeWithCoordinates:self.mapView.region.center
                                              range:@(rangeValue)
                                       completion:^(NSArray *result) {
                                             ;
                                             NSArray *oldAnnotations = ]];
                                             oldAnnotations = ;
                                             markers = ];
                                             //;

                                             NSMutableArray *allMapMarkersMutable = [ init];
                                             for(Marker *dbmarker in markers) {
                                                 MarkerAnnotation *marker = [ init];
                                                 marker.coordinate = CLLocationCoordinate2DMake(, );
                                                 marker.userData = dbmarker;
                                                 ;
                                                 ;
                                             }
                                             self.allMapMarkers = [ arrayByAddingObjectsFromArray:oldAnnotations];

                                             if(_searchMarker != nil &amp;&amp; !) {
                                                 ;

                                             }

                                             if(self.aggressionIdToCenter != nil) {
                                                 ;
                                                 self.aggressionIdToCenter = nil;
                                             }
                                       } error:^{
    }];

    /*NSArray *oldAnnotations = ]];
    oldAnnotations = ;
    markers = ];
//    ;

    NSMutableArray *allMapMarkersMutable = [ init];
    for(Marker *dbmarker in markers) {
      MarkerAnnotation *marker = [ init];
      marker.coordinate = CLLocationCoordinate2DMake(, );
      marker.userData = dbmarker;
      ;
      ;
    }
    self.allMapMarkers = [ arrayByAddingObjectsFromArray:oldAnnotations];

    if(_searchMarker != nil &amp;&amp; !) {
      ;
    }

    if(self.aggressionIdToCenter != nil) {
      ;
      self.aggressionIdToCenter = nil;
    }*/
}

//-(void)mapView:(GMSMapView *)mapView didTapAtCoordinate:(CLLocationCoordinate2D)coordinate {
//    ;
//}

#pragma mark - UITextFieldDelegate and place search

- (BOOL)textFieldShouldReturn:(UITextField *)textField {
    ;
    MKCoordinateRegion newRegion;
    newRegion.center.latitude = locationManager.location.coordinate.latitude;
    newRegion.center.longitude = locationManager.location.coordinate.longitude;

    // Setup the area spanned by the map region:
    // We use the delta values to indicate the desired zoom level of the map,
    //      (smaller delta values corresponding to a higher zoom level).
    //      The numbers used here correspond to a roughly 8 mi
    //      diameter area.
    //
    newRegion.span.latitudeDelta = 0.112872;
    newRegion.span.longitudeDelta = 0.109863;

    MKLocalSearchRequest *request = [ init];

    request.naturalLanguageQuery = textField.text;
    request.region = newRegion;

    MKLocalSearch *localSearch = [ initWithRequest:request];

    MKLocalSearchCompletionHandler completionHandler = ^(MKLocalSearchResponse *response, NSError *error) {
      if (error != nil) {
//            NSString *errorStr = [ valueForKey:NSLocalizedDescriptionKey];
//            UIAlertView *alert = [ initWithTitle:@&#34;Could not find places&#34;
//                                                            message:errorStr
//                                                         delegate:nil
//                                                cancelButtonTitle:@&#34;OK&#34;
//                                                otherButtonTitles:nil];
//            ;
      } else {
            NSArray&lt;MKMapItem *&gt; *mapItems = ;
            if(mapItems.count &gt; 0) {
                MKCoordinateRegion boundingRegion = response.boundingRegion;
                MKMapItem *item = mapItems;
                self.searchMarker = item.placemark;

                ;
                ;

            }
      }
    };

    ;


double radians(double degrees) {
    return degrees * M_PI / 180.0;
}

double degrees(double radians) {
    return radians * 180.0 / M_PI;
}
const CLLocationDegrees kLatLonEarthRadius = 6371.0;

CLLocationCoordinate2D LatLonDestPoint(CLLocationCoordinate2D origin, double bearing, CLLocationDistance distance) {
    double brng = radians(bearing);
    double lat1 = radians(origin.latitude);
    double lon1 = radians(origin.longitude);

    CLLocationDegrees lat2 = asin(sin(lat1) * cos(distance / kLatLonEarthRadius) +
                                  cos(lat1) * sin(distance / kLatLonEarthRadius) * cos(brng));
    CLLocationDegrees lon2 = lon1 + atan2(sin(brng) * sinf(distance / kLatLonEarthRadius) * cos(lat1),
                                          cosf(distance / kLatLonEarthRadius) - sin(lat1) * sin(lat2));
    lon2 = fmod(lon2 + M_PI, 2.0 * M_PI) - M_PI;

    CLLocationCoordinate2D coordinate;
    if (! (isnan(lat2) || isnan(lon2))) {
      coordinate.latitude = degrees(lat2);
      coordinate.longitude = degrees(lon2);
    }

    return coordinate;
}

#pragma mark - CheckInDelegate

- (void)willRemoveCheckinView {
    [ setStatusBarHidden:NO
                                          withAnimation:UIStatusBarAnimationSlide];
    [self.navigationController setNavigationBarHidden:NO
                                             animated:YES];
}
</code></pre></p>
                                    <br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
                                            <p><p>问题是您在 <code>MKLocalSearchCompletionHandler</code> 中添加标记,因此从 <code>MKLocalSearchCompletionHandler</code> 中删除以下行将解决您的问题。 </p>

<pre><code>;
</code></pre></p>
                                   
                                                <p style="font-size: 20px;">关于ios - 当我搜索一个地方时,它会丢弃一个 pin mapView,我们在Stack Overflow上找到一个类似的问题:
                                                        <a href="https://stackoverflow.com/questions/40802266/" rel="noreferrer noopener nofollow" style="color: red;">
                                                                https://stackoverflow.com/questions/40802266/
                                                        </a>
                                                </p>
                                       
页: [1]
查看完整版本: ios - 当我搜索一个地方时,它会丢弃一个 pin mapView