我在UIPopoverController的内容中有一个按钮。此按钮运行名为myAction的方法。
MyAction的格式为
- (void) myAction:(id)sender
所以,myAction会收到来电按钮的ID。
现在,在这个方法中我想解雇UIPopoverController,但我唯一拥有的是调用者按钮的ID。请记住,该按钮位于UIPopoverController内。
根据我已经拥有的按钮ID,有没有办法发现UIPopoverController的ID?
感谢。
答案 0 :(得分:19)
不幸的是没有。至少,不在标准做法范围内。你可能能够在应答器堆栈中找到它,但它是一个黑客,它是错误的,它真的非常麻烦。
如果你想通过按下一个按钮来关闭一个弹出窗口,一些相关的地方应该保留一个对弹出窗口的引用。通常那将是popover的所有者(不控制器在 popover中显示)。按下按钮时,它可以向所有者控制器发送消息,然后可以解除弹出窗口。
你可能想让控制器显示在popover内部是它自己的popover的所有者,但是这种方式编码很脆弱,可能会变得混乱(再次),并且可能导致保留循环以便既不会释放
答案 1 :(得分:5)
您可以通过使用KVC访问“popoverController”来访问呈现的popoverController。
[[self valueForKey:@"popoverController"] dismissPopoverAnimated:YES]
答案 2 :(得分:4)
我有这个工作,我不认为这是一个黑客。我有一个标准的拆分视图iPad应用程序。然后我在我的细节控制器(弹出窗口的所有者)上添加了一个方法来处理解雇。
在标准拆分视图架构中,根视图控制器和详细视图控制器都可通过应用程序委托获得。所以我在弹出窗口内点击了一个按钮,调用一个获取app委托的方法。从那里我调用细节控制器上的方法来消除弹出。
这是在视图控制器上显示在popover中的方法的代码:
- (void) exitView: (id)sender {
MyAppDelegate *appDelegate = (MyAppDelegate *)[[UIApplication sharedApplication] delegate];
[appDelegate.detailViewController exitDrill];
}
然后在Detail View Controller上关闭的简单方法:
- (void) exitDrill {
if(dtController != nil){
[dtController dismissPopoverAnimated: YES];
[dtController release];
}
}
我喜欢这样做的能力,因为它让我有办法向用户展示他们如何退出弹出窗口。在将来的应用程序版本中,这可能不是必需的;就目前而言,虽然这个范例对平台来说仍然是新的,但我更愿意让用户以不同的方式展示一个显示器,以确保我最大限度地减少挫败感。
答案 3 :(得分:0)
Ed Marty已经写过了
如果你想通过按下按钮来关闭一个弹出窗口,一些相关的地方应该保留对popover的引用
这是真的;但是,在显示UIPopoverController时,打开popovercontroller的类会保留此资源。因此,您可以做的是将此类用作Popover控制器的委托类。
为此,您可以执行以下操作,我在代码中使用了以下内容。 在打开popover的类中,这是我的代码:
- (void)showInformationForView:(Booking*)booking frame:(CGRect)rect
{
BookingDetailsViewController *bookingView = [[BookingDetailsViewController alloc] initWithStyle:UITableViewStyleGrouped booking:booking];
[bookingView setDelegate:self];
UINavigationController *navController = [[UINavigationController alloc] initWithRootViewController:bookingView];
self.popController = [[UIPopoverController alloc] initWithContentViewController:navController];
[self.popController setDelegate:self];
[self.popController setPopoverContentSize:CGSizeMake(320, 320)];
rect.size.width = 0;
[self.popController presentPopoverFromRect:rect inView:self.view permittedArrowDirections:UIPopoverArrowDirectionLeft animated:YES];
}
- (void)dismissPopoverAnimated:(BOOL)animated
{
[self.popController dismissPopoverAnimated:animated];
}
所以我在这里做的是创建一个UINavigationController
并将BookingDetailsViewController
设置为rootViewController
。然后我还将当前类作为委托添加到此BookingDetailsViewController
。
我添加的第二件事是名为dismissPopoverAnimated:animated
的解雇方法。
在我的BookingDetailsViewController.h
中,我添加了以下代码:
[...]
@property (nonatomic, strong) id delegate;
[...]
在我的BookingDetailsViewController.m
中,我添加了以下代码:
[...]
@synthesize delegate = _delegate;
- (void)viewDidLoad
{
UIBarButtonItem *closeButton = [[UIBarButtonItem alloc] initWithTitle:@"Close" style:UIBarButtonItemStylePlain target:self action:@selector(closeView)];
[self.navigationItem setRightBarButtonItem:closeButton];
[super viewDidLoad];
}
- (void)closeView
{
if ([self.delegate respondsToSelector:@selector(dismissPopoverAnimated:)]) {
[self.delegate dismissPopoverAnimated:YES];
}
else {
NSLog(@"Cannot close the view, nu such dismiss method");
}
}
[...]
当按下UINavigationController中的“关闭”按钮时,会调用方法closeView
。此方法检查委托是否响应dismissPopoverAnimated:animated
,如果是,则调用它。如果它没有响应这个方法,它将显示一条日志消息,不再做任何事情(所以它不会崩溃)。
我使用ARC编写了代码,因此没有内存管理。
我希望这对你有所帮助。