2010-04-13 76 views
8

我在UIPopoverController的内容中有一个按钮。这个按钮运行一个名为myAction的方法。ipad - 解雇UIPopoverController

MyAction具有

- (void) myAction:(id)sender 

所以,myAction接收呼叫者按钮的ID的形式。

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

有没有一种方法来发现UIPopoverController的ID,给出我已经有的按钮ID?

谢谢。

回答

19

不幸的是没有。至少,不在标准做法内。你可能能够通过响应堆栈来找到它,但这是一个黑客攻击,它很麻烦,而且确实很杂乱。

如果您想通过按下按钮来解除弹出窗口,某个相关的地方应该保留对弹窗的引用。通常这将是popover的所有者(而不是控制器显示的popover内)。按下按钮后,它可以向所有者控制器发送消息,然后可以解除弹出窗口。

您可能会想让控制器在弹出窗口内显示为自己的弹出窗口的所有者,但这种方式的编码很脆弱,可能会变得混乱(可能会再次),并可能导致保留循环,释放。

+0

谢谢。我会改变代码! – SpaceDog 2010-04-13 16:00:40

+3

第二段在这个答案中非常重要。请记住,根据iPad编程指南:“但请注意,您有责任存储对popover控制器的引用,以便解除它,系统默认不提供。”因此,不要对其执行“释放”(直到父视图进入dealloc阶段)。 (这是我的安全方法)。 – Jann 2010-04-14 17:04:25

+0

只需使用[self dismissViewControllerAnimated:YES completion:nil]; “呈现视图控制器负责解除其呈现的视图控制器,如果您在呈现的视图控制器本身上调用此方法,它会自动将该消息转发给呈现视图控制器。” – 2014-04-03 18:44:20

4

我有这个工作,我不认为这是一个破解。我有一个标准的拆分视图iPad应用程序。然后我在细节控制器(弹出窗口的拥有者)上添加了一个方法来处理解雇。

在标准拆分视图架构上,根和视图控制器都可以通过应用程序委托来使用。所以我在弹出窗口中单击一个按钮来调用一个获取应用程序委托的方法。从那里,我称之为详细控制器上的方法来消除流行音乐。

这对于在酥料饼的内部显示在视图控制器的方法的代码:

- (void) exitView: (id)sender { 
    MyAppDelegate *appDelegate = (MyAppDelegate *)[[UIApplication sharedApplication] delegate]; 

    [appDelegate.detailViewController exitDrill]; 
} 

然后简单的方法以关闭上的详细视图控制器:

- (void) exitDrill { 
    if(dtController != nil){ 
     [dtController dismissPopoverAnimated: YES]; 
     [dtController release]; 
    } 
} 

我喜欢能够做到这一点,因为它给我一种方式来向用户展示他们如何退出流行音乐。这在未来的应用程序版本中可能不是必需的;现在,虽然这个范例对这个平台来说仍然是新的,但我更愿意让用户在不同的方式中对一个对象进行显示,以确保我最大限度地减少挫折感。

5

您可以通过访问KVC的“popoverController”来访问呈现popoverController。

[[self valueForKey:@"popoverController"] dismissPopoverAnimated:YES] 
+1

智能,但是有这种机会被标记为“使用私有API”,应用程序被拒绝,即使技术上它没有使用私有API? – 2012-09-07 13:00:13

+0

是@Chintan。如果他们检测到您的代码正在使用其“私有API”,它可能会被AppStore拒绝。 – 2012-11-22 11:23:31

+0

@JasonMing这是我唯一的工作,我花了5小时的最佳部分试图找到解决方案。非常感谢... – 2016-11-27 23:22:57

0

爱德马蒂已经写

如果您想通过按下一个按钮驳回酥料饼,一些地方相关的应恪守酥料饼

参考这是非常真实的;但是,在显示UIPopoverController时,打开popovercontroller的类已经保存了该资源。所以,你可以做的是使用这个类作为你的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和设置BookingDetailsViewControllerrootViewController。然后,我还将当前班级作为代表添加到此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写过我的代码,因此没有内存管理。

我希望这对你有所帮助。

相关问题