У меня есть MKMapView (также UIPopoverControllerDelegate) с Аннотациями. Этот MapView имеет, в файле MKTestMapView.h, a UIPopoverController* popoverController
определенный в @interface и a @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, и легкая сдоба уходит..., но мне нужен пользователь для нажатия кнопки в представлении, если они изменяют что-нибудь. URGH!
Шоу документов:
Для отклонения легкой сдобы программно назовите dismissPopoverAnimated: метод контроллера легкой сдобы.
Ну, вот проблема: По определению того, как popoverController работает, Вы нажимаете в представлении отображенной легкой сдобы (для нажатия кнопки), но должны инициировать dismissPopoverAnimated:
метод контроллера, который запустил это представление легкой сдобы, в моем случае, 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];
}
Вот моя проблема: Я не могу выяснить, дает ли выполнение вышеупомянутого мне a reference
(если существует такая вещь) к существующему представлению, которое находится на экране - и поэтому представление, которое является владельцем этого popoverController. Если это столь же просто как
[[[self parentView] popoverController].dismissPopoverAnimated:YES];
Я застрелюсь, потому что я не думаю, что это - правильный синтаксис также!
Это должно быть легко... все же, я потерян. (вероятно, просто разбитый таким количеством различий в iPad, которые я изучаю).
Кто-либо может объяснить больше?
У меня была такая же проблема... У меня была аккуратная кнопка "закрыть" (X) в верхней части моего представления, загружаемого всплывающим окном, но она не работала. В моем универсальном приложении она будет представлена как новое представление, так что этот код должен остаться.
Теперь я добавил следующее к моему detailedPinView (вид, который загружает popover):
В файле detailedPinView.h:
@interface detailedPinView : UIViewController {
[...]
UIPopoverController *popover;
[...]
}
-(void)setPopover:(UIPopoverController*)aPopover;
В файле detailedPinView.m:
- (void)setPopover:(UIPopoverController*)aPopover
{
popover = aPopover;
}
Кнопка X закрывает вид с помощью IBAction, вот что я сделал:
В файле detailedPinView. m file:
-(IBAction)releaseDetailedView:(UIButton *)sender
{
if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad)
{
if (popover != nil)
{
[popover dismissPopoverAnimated:YES];
}
else {
NSLog(@"Nothing to dismiss");
}
}
else{
[self.parentViewController dismissModalViewControllerAnimated: YES];
}
}
В классе, загружающем мою карту и всплывающее представление, я добавил следующий код:
[...]
-(void)mapView:(MKMapView *)theMapView annotationView:(MKAnnotationView *)pin calloutAccessoryControlTapped:(UIControl *)control
{
UIViewController *detailController = [[detailedPinView alloc] initWithNibName:@"detailedPinView"
bundle:nil
annotationView:pin];
if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad)
{
UIPopoverController* aPopover = [[UIPopoverController alloc] initWithContentViewController:detailController];
[aPopover setDelegate:self];
[aPopover setPopoverContentSize:CGSizeMake(320, 320) animated:YES];
[detailController setPopover:aPopover];
[detailController release];
[mapView deselectAnnotation:pin.annotation animated:YES];
self.popoverController = aPopover;
[mapView setCenterCoordinate:pin.annotation.coordinate animated:YES];
[self.popoverController presentPopoverFromRect:CGRectMake(382,498,0,0) inView:self.view permittedArrowDirections:UIPopoverArrowDirectionUp animated:YES];
}
else
{
[self presentModalViewController: detailController animated:YES];
}
[detailController release];
}
[...]
Я не знаю, был ли это тот ответ, на который вы надеялись, я думаю, что это может быть немного грязным способом сделать это... но с учетом временного графика это сработало как шарм :)
.