ipad - 解雇UIPopoverController

时间:2010-04-13 14:25:53

标签: iphone iphone-sdk-3.0 ipad

我在UIPopoverController的内容中有一个按钮。此按钮运行名为myAction的方法。

MyAction的格式为

- (void) myAction:(id)sender 

所以,myAction会收到来电按钮的ID。

现在,在这个方法中我想解雇UIPopoverController,但我唯一拥有的是调用者按钮的ID。请记住,该按钮位于UIPopoverController内。

根据我已经拥有的按钮ID,有没有办法发现UIPopoverController的ID?

感谢。

4 个答案:

答案 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编写了代码,因此没有内存管理。

我希望这对你有所帮助。