gpt4 book ai didi

iphone - 如何在 MKMapView (SDK3.2) 中使用 UIPopoverController 在 iPad 上关闭 PopoverAnimated

转载 作者:行者123 更新时间:2023-12-03 18:32:05 27 4
gpt4 key购买 nike

我有一个带注释的 MKMapView(也是一个 UIPopoverControllerDelegate)。该MapView在MKTestMapView.h文件中,在@interface中定义了一个UIPopoverController* popoverController和一个@property(非原子,保留)UIPopoverController* popoverController; @interface 部分之外定义。该 Controller 在 MKTestMapView.m 文件中为 @synthesized,并在 - (void)dealloc 部分中发布。此 MapView 中的注释将 rightCalloutAccessoryView 定义为以下内容:

- (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 上的任意位置,弹出窗口就会消失...但我需要用户在更改任何内容时单击 View 中的按钮。呃!

文档显示:

To dismiss a popover programmatically, call the dismissPopoverAnimated: method of the popover controller.

问题是:根据 popoverController 工作方式的定义,您在显示的弹出窗口的 View 中单击内部(以单击按钮),但必须触发 dismissPopoverAnimated :启动此弹出窗口 View 的 Controller 的方法,在我的例子中,是MKTestMapView.m文件中的popoverController

现在,说了这么多,请记住,[popoverController release] 不会发生,直到:

- (void)dealloc {
[popoverController release];
[mapView release];
[super dealloc];
}

那么,我是否只需在按钮内执行以下操作(凌乱但可能有效):

(假设我的弹出窗口 View 是 TableView)在:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
MKTestMapView * mKTestMapView = [[MKTestMapView alloc] init];
[[mKTestMapView popoverController].dismissPopoverAnimated:YES];
}

这是我的问题:我无法弄清楚执行上述操作是否为我提供了对现有 View 的引用(如果有这样的事情) screen——因此 View 是该 popoverController 的所有者。如果它像

那么简单
[[[self parentView] popoverController].dismissPopoverAnimated:YES];

我会开枪自杀,因为我认为这也不是正确的语法!

这应该很容易......但我迷路了。 (可能只是对我正在了解的 iPad 的这么多差异感到沮丧)。

谁能解释一下吗?

最佳答案

我遇到了同样的问题...我的 View 顶部有一个由弹出窗口加载的简洁的“关闭”按钮(X),但它不起作用。在我的通用应用程序中,它将显示为新 View ,因此代码应该保留。

我现在所做的是将以下内容添加到我的detailedPinView(弹出窗口加载的 View )中:

在详细的PinView.h文件中:

@interface detailedPinView : UIViewController {
[...]
UIPopoverController *popover;
[...]
}

-(void)setPopover:(UIPopoverController*)aPopover;

在详细的PinView.m文件中:

- (void)setPopover:(UIPopoverController*)aPopover
{
popover = aPopover;
}

X 按钮使用 IBAction 关闭 View ,这就是我在那里所做的:

在详细的PinView.m文件中:

-(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];
}
}

在加载我的地​​图和弹出窗口 View 的类中,我添加了以下代码:

[...]
-(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];
}
[...]

我不知道这是否是您所希望的答案,我认为这可能是一种有点困惑的方式......但是给出时间表这就像一个魅力:)

关于iphone - 如何在 MKMapView (SDK3.2) 中使用 UIPopoverController 在 iPad 上关闭 PopoverAnimated,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2639350/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com