У меня есть MKMapView (также UIPopoverControllerDelegate) с аннотациями. Этот MapView имеет в файле MKTestMapView.h UIPopoverController* popoverController
, определенный в @interface, и @property (nonatomic, retain) UIPopoverController* popoverController;
, определенный вне раздела @interface
. Этот контроллер находится @synthesized
в файле MKTestMapView.m и выпущен в разделе - (void)dealloc
. Аннотации в этом MapView имеют rightCalloutAccessoryView
s, определенные следующим образом:
- (void)mapView:(MKMapView *)mapView2 annotationView:(MKAnnotationView *)aview calloutAccessoryControlTapped:(UIControl *)control{
...
CGPoint leftTopPoint = [mapView2 convertCoordinate:aview.annotation.coordinate toPointToView:mapView2];
int boxDY=leftTopPoint.y;
int boxDX=leftTopPoint.x;
NSLog(@"\nDX:%d,DY:%d\n",boxDX,boxDY);
popoverController = [[UIPopoverController alloc] initWithContentViewController:controller];
popoverController.delegate = self;
CGSize maximumLabelSize = CGSizeMake(320.0f,600.0f);
popoverController.popoverContentSize = maximumLabelSize;
CGRect rect = CGRectMake(boxDX, boxDY, 320.0f, 600.0f);
[popoverController presentPopoverFromRect:rect inView:self.view permittedArrowDirections:UIPopoverArrowDirectionRight animated:YES];
...
}
А теперь самое интересное. Прежде всего, я не уверен, нужно ли мне, чтобы maximumLabelSize
и rect
были одинакового размера. Я новичок в popovercontroller, поэтому играю на слух ..
Хорошо, всплывающее окно показывает. Теперь отклоняем это. Я могу щелкнуть в любом месте mapView2, и всплывающее окно исчезнет ... но мне нужно, чтобы пользователь щелкнул кнопку в представлении, если они что-то меняют. УРГ!
Документы показывают:
Чтобы программно закрыть всплывающее окно, вызовите метод dismissPopoverAnimated: контроллера всплывающего окна.
Что ж, вот проблема: по определению того, как работает popoverController, вы нажимаете внутри представления отображаемого всплывающего окна (чтобы щелкнуть кнопку), но должны вызвать метод dismissPopoverAnimated:
контроллера, который < strong> запустил это всплывающее окно, в моем случае popoverController
внутри файла MKTestMapView.m.
Теперь, сказав все это, помните, [popoverController release]
не произойдет до тех пор, пока:
- (void)dealloc {
[popoverController release];
[mapView release];
[super dealloc];
}
Итак, могу ли я просто сделать следующее внутри кнопки (беспорядочно, но может сработать):
(Предполагая, что мое всплывающее окно представляет собой TableView) В:
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
MKTestMapView * mKTestMapView = [[MKTestMapView alloc] init];
[[mKTestMapView popoverController].dismissPopoverAnimated:YES];
}
Вот моя проблема: я не могу понять, дает ли мне выполнение вышеизложенного reference
(если такое есть) к существующему представлению на экране - и, следовательно, представлению, которое является владелец этого popoverController. Если это так просто, как
[[[self parentView] popoverController].dismissPopoverAnimated:YES];
Я застрелюсь, потому что я тоже не думаю, что это правильный синтаксис!
Это должно быть легко ... но я заблудился. (вероятно, просто разочарован таким количеством различий в iPad, которые я изучаю).
Кто-нибудь может объяснить больше?