如何select地图引脚时,窃听与其关联的表格行?

在这里我有两个意见:

  • WallViewController
  • TableViewController

WallViewController包含MKMapView, TableViewControllerPFQueryTableViewController的子类, 用于显示与WallViewController上的注释引脚关联的内容行。 TableViewController作为WallViewController的子视图添加,所以这两个视图一起显示。 现在,当我点击地图上的注释引脚时, TableViewController中的tableview将滚动到与成功select的注释引脚关联的行。 但是我想要做的是也有一个相反的动作,所以当我点击一行时,与该行关联的注释引脚将被选中,并且其标注将被显示。

下面我提供了相关的代码:

WallViewController.h

@interface WallViewController : UIViewController <MKMapViewDelegate, CLLocationManagerDelegate> @property (nonatomic, strong) IBOutlet MKMapView *mapView; @end @protocol WallViewControllerHighlight <NSObject> - (void)highlightCellForPost:(PAWPost *)post; - (void)unhighlightCellForPost:(PAWPost *)post; @end 

WallViewController.m

 - (void)viewDidLoad { [super viewDidLoad]; self.tableViewController = [[TableViewController alloc] initWithStyle:UITableViewStylePlain]; [self addChildViewController:self.tableViewController]; self.tableViewController.view.frame = CGRectMake(6.0f, 215.0f, 308.0f, self.view.bounds.size.height - 215.0f); [self.view addSubview:self.tableViewController.view]; self.wallPostsTableViewController.wallViewController = self; .... } - (void)mapView:(MKMapView *)mapView didSelectAnnotationView:(MKAnnotationView *)view { id<MKAnnotation> annotation = [view annotation]; if ([annotation isKindOfClass:[PAWPost class]]) { PAWPost *post = [view annotation]; [PostsTableViewController highlightCellForPost:post]; } else if ([annotation isKindOfClass:[MKUserLocation class]]) { // Center the map on the user's current location: AppDelegate *appDelegate = [[UIApplication sharedApplication] delegate]; MKCoordinateRegion newRegion = MKCoordinateRegionMakeWithDistance(appDelegate.currentLocation.coordinate, appDelegate.filterDistance * 2, appDelegate.filterDistance * 2); [self.mapView setRegion:newRegion animated:YES]; self.mapPannedSinceLocationUpdate = NO; } } 

TableViewController.h

 @interface TableViewController : PFQueryTableViewController <WallViewControllerHighlight> @property (nonatomic, strong) PAWWallViewController *wallViewController; - (void)highlightCellForPost:(PAWPost *)post; - (void)unhighlightCellForPost:(PAWPost *)post; @end 

TableViewController.m

 .... @synthesize wallViewController; .... - (void)highlightCellForPost:(PAWPost *)post { // Find the cell matching this object. for (PFObject *object in [self objects]) { PAWPost *postFromObject = [[PAWPost alloc] initWithPFObject:object]; if ([post equalToPost:postFromObject]) { // We found the object, scroll to the cell position where this object is. NSUInteger index = [[self objects] indexOfObject:object]; NSIndexPath *indexPath = [NSIndexPath indexPathForRow:index inSection:kTableViewMainSection]; [self.tableView scrollToRowAtIndexPath:indexPath atScrollPosition:UITableViewScrollPositionMiddle animated:YES]; [self.tableView selectRowAtIndexPath:indexPath animated:NO scrollPosition:UITableViewScrollPositionNone]; return; } } // Don't scroll for posts outside the search radius. if ([post.title compare:kWallCantViewPost] != NSOrderedSame) { // We couldn't find the post, so scroll down to the load more cell. NSUInteger rows = [self.tableView numberOfRowsInSection:kTableViewMainSection]; NSIndexPath *indexPath = [NSIndexPath indexPathForRow:(rows - 1) inSection:kTableViewMainSection]; [self.tableView scrollToRowAtIndexPath:indexPath atScrollPosition:UITableViewScrollPositionBottom animated:YES]; [self.tableView selectRowAtIndexPath:indexPath animated:NO scrollPosition:UITableViewScrollPositionNone]; [self.tableView deselectRowAtIndexPath:indexPath animated:YES]; } } - (void)unhighlightCellForPost:(PAWPost *)post { // Deselect the post's row. for (PFObject *object in [self objects]) { PAWPost *postFromObject = [[PAWPost alloc] initWithPFObject:object]; if ([post equalToPost:postFromObject]) { NSUInteger index = [[self objects] indexOfObject:object]; NSIndexPath *indexPath = [NSIndexPath indexPathForRow:index inSection:0]; [self.tableView deselectRowAtIndexPath:indexPath animated:YES]; return; } } } - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { // call super because we're a custom subclass. [super tableView:tableView didSelectRowAtIndexPath:indexPath]; [tableView deselectRowAtIndexPath:indexPath animated:YES]; // highlight annotation pin on map - my problem is here ???? NSLog(@"tap row --> %i", indexPath.row); //******1***** NSLog(@"annotation count --> %i", [self.objects count]); //*****2***** UITableViewCell *selectedCell = [tableView cellForRowAtIndexPath:indexPath]; UILabel *textLabel = (UILabel*) [selectedCell.contentView viewWithTag:kPAWCellTextLabelTag]; NSLog(@"textlabel at the table row tapped --> %@", textLabel.text); //*****3***** for (NSInteger i = 0; i < [self.objects count]; i++) { PFObject *object = [self.objects objectAtIndex:i]; PAWPost *postFromObject = [[PAWPost alloc] initWithPFObject:object]; NSString *text = postFromObject.title; NSLog(@"text retrieved from PAWPost --> %@", text); //*****4***** if ([text isEqualToString:textLabel.text]) { NSLog(@"found matching at %i", i); //*****5***** [wallViewController.mapView selectAnnotation:[[wallViewController.mapView annotations] objectAtIndex:i] animated:YES]; NSLog(@"wallViewController --> %@", wallViewController); //*****6***** NSLog(@"wallViewController mapView --> %@", wallViewController.mapView); //*****7***** } } } 

我的问题是在最后一个方法(无效)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)TableViewController.m中的 indexPath 。 现在我有你所看到的代码,使用:

 [wallViewController.mapView selectAnnotation:[[wallViewController.mapView annotations] objectAtIndex:i] animated:YES]; 

但似乎没有工作。 这里一定有什么问题,但是我不知道它是什么。

在这里,我点击表格的第一行就提供了我的日志输出:

 2015-01-28 11:24:31.886 Test[8097:60b] tap row --> 0 2015-01-28 11:24:31.888 Test[8097:60b] annotation count --> 40 2015-01-28 11:24:31.890 Test[8097:60b] textlabel at the table row tapped --> Asddsdtest 2015-01-28 11:24:31.890 Test[8097:60b] text retrieved from PAWPost --> ...(40 texts here) 2015-01-28 11:24:31.897 Test[8097:60b] found matching at 0 2015-01-28 11:24:31.899 Test[8097:60b] wallViewController --> (null) 2015-01-28 11:24:31.900 Test[8097:60b] wallViewController mapView --> (null) 

PS我发现这个问题,但答案和评论似乎没有提供足够的细节像我这样的初学者。

附加信息添加

PAWPost.h

 @interface PAWPost : NSObject <MKAnnotation> //@protocol MKAnnotation <NSObject> // Center latitude and longitude of the annotion view. // The implementation of this property must be KVO compliant. @property (nonatomic, readonly) CLLocationCoordinate2D coordinate; // @optional // Title and subtitle for use by selection UI. @property (nonatomic, readonly, copy) NSString *title; @property (nonatomic, readonly, copy) NSString *subtitle; // @end // Other properties: @property (nonatomic, readonly, strong) PFObject *object; @property (nonatomic, readonly, strong) PFGeoPoint *geopoint; @property (nonatomic, readonly, strong) PFUser *user; @property (nonatomic, assign) BOOL animatesDrop; @property (nonatomic, readonly) MKPinAnnotationColor pinColor; // Designated initializer. - (id)initWithCoordinate:(CLLocationCoordinate2D)coordinate andTitle:(NSString *)title andSubtitle:(NSString *)subtitle; - (id)initWithPFObject:(PFObject *)object; - (BOOL)equalToPost:(PAWPost *)aPost; - (void)setTitleAndSubtitleOutsideDistance:(BOOL)outside; @end 

PAWPost.m

 @interface PAWPost () // Redefine these properties to make them read/write for internal class accesses and mutations. @property (nonatomic, assign) CLLocationCoordinate2D coordinate; @property (nonatomic, copy) NSString *title; @property (nonatomic, copy) NSString *subtitle; @property (nonatomic, strong) PFObject *object; @property (nonatomic, strong) PFGeoPoint *geopoint; @property (nonatomic, strong) PFUser *user; @property (nonatomic, assign) MKPinAnnotationColor pinColor; @end @implementation PAWPost - (id)initWithCoordinate:(CLLocationCoordinate2D)aCoordinate andTitle:(NSString *)aTitle andSubtitle:(NSString *)aSubtitle { self = [super init]; if (self) { self.coordinate = aCoordinate; self.title = aTitle; self.subtitle = aSubtitle; self.animatesDrop = NO; } return self; } - (id)initWithPFObject:(PFObject *)anObject { self.object = anObject; self.geopoint = [anObject objectForKey:kPAWParseLocationKey]; self.user = [anObject objectForKey:kPAWParseUserKey]; [anObject fetchIfNeeded]; CLLocationCoordinate2D aCoordinate = CLLocationCoordinate2DMake(self.geopoint.latitude, self.geopoint.longitude); NSString *aTitle = [anObject objectForKey:kPAWParseTextKey]; NSString *aSubtitle = [[anObject objectForKey:kPAWParseUserKey] objectForKey:kPAWParseUsernameKey]; return [self initWithCoordinate:aCoordinate andTitle:aTitle andSubtitle:aSubtitle]; } - (BOOL)equalToPost:(PAWPost *)aPost { if (aPost == nil) { return NO; } if (aPost.object && self.object) { // We have a PFObject inside the PAWPost, use that instead. if ([aPost.object.objectId compare:self.object.objectId] != NSOrderedSame) { return NO; } return YES; } else { // Fallback code: if ([aPost.title compare:self.title] != NSOrderedSame || [aPost.subtitle compare:self.subtitle] != NSOrderedSame || aPost.coordinate.latitude != self.coordinate.latitude || aPost.coordinate.longitude != self.coordinate.longitude ) { return NO; } return YES; } } - (void)setTitleAndSubtitleOutsideDistance:(BOOL)outside { if (outside) { self.subtitle = nil; self.title = kPAWWallCantViewPost; self.pinColor = MKPinAnnotationColorRed; } else { self.title = [self.object objectForKey:kPAWParseTextKey]; //self.subtitle = [[self.object objectForKey:kPAWParseUserKey] objectForKey:kPAWParseUsernameKey]; self.subtitle = [NSString stringWithFormat:@"@%@",[[self.object objectForKey:kPAWParseUserKey] objectForKey:kPAWParseUsernameKey]]; self.pinColor = MKPinAnnotationColorGreen; } } @end 

你可以使用PFObject.objectId来find你想要的注解。

 PFObject *selectedObject = [self.objects objectAtIndex:i]; for (id annotation in wallViewController.mapView.annotations) { if ([annotation isKindOfClass:[PAWPost class]]) { PAWPost *post = (PAWPost*)annotation; if ([post.object.objectId isEqualToString:selectedObject.objectId]) { [wallViewController.mapView selectAnnotation:annotation animated:YES]; break; } } } 

您可以将您的注释做为支持MSAnnotation协议的对象。 所以当你select你的单元格时,你完全知道这个动作背后是什么东西。 在这种情况下,您的注释将完全是您通过点击UITableViewCellselect的对象。

所以 – 你的对象PAWPost只是应该支持MKAnnotation协议:

 @interface PAWPost : NSObject <MKAnnotation> // Interface here @end @implementation PAWPost // ... - (CLLocationCoordinate2D)coordinate { return <#your coordinate here#>; } // ... @end 

PS您不需要在didSelectRowAtIndexPath:方法中创buildWallViewController类的新本地实例。 因为那时你的WallViewController将不会有MapView。 相反,创buildWallViewController的实例之前,并使用指针。