Как к dismissPopoverAnimated на iPad с UIPopoverController в MKMapView (SDK3.2)

У меня есть MKMapView (также UIPopoverControllerDelegate) с Аннотациями. Этот MapView имеет, в файле MKTestMapView.h, a UIPopoverController* popoverController определенный в @interface и a @property (nonatomic, retain) UIPopoverController* popoverController; определенный за пределами @interface раздел. Этот контроллер @synthesized в файле MKTestMapView.m и это выпущено в - (void)dealloc раздел. Аннотации в этом MapView имеют rightCalloutAccessoryViews определенный к следующему:

- (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, которые я изучаю).

Кто-либо может объяснить больше?

9
задан Jann 14 April 2010 в 19:58
поделиться

1 ответ

У меня была такая же проблема... У меня была аккуратная кнопка "закрыть" (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];
}
[...]

Я не знаю, был ли это тот ответ, на который вы надеялись, я думаю, что это может быть немного грязным способом сделать это... но с учетом временного графика это сработало как шарм :)

.
18
ответ дан 4 December 2019 в 11:04
поделиться
Другие вопросы по тегам:

Похожие вопросы: