【问题标题】:Dismiss Popover When Row Selected?选择行时关闭弹出框?
【发布时间】:2011-08-23 01:13:05
【问题描述】:

当 UISPlitViewControler 处于弹出模式时,从主视图中选择一行时。不是应该自动解散吗?我怎样才能在那里修复它?

通常我会使用[self.popoverController dismissPopoverAnimated:YES];,但在这种情况下无法识别popoverController

我认为UISplitViewController 应该自动执行此操作?

这是我的 detailViewCONtroller 中的 UISplitViewDelegate 代码:

- (void)splitViewController:(UISplitViewController *)svc willHideViewController:(UIViewController *)aViewController withBarButtonItem:(UIBarButtonItem *)barButtonItem forPopoverController: (UIPopoverController *)pc
{
    barButtonItem.title = @"Medical Codes";
    NSMutableArray *items = [[self.toolbar items] mutableCopy];
    [items insertObject:barButtonItem atIndex:0];
    [self.toolbar setItems:items animated:YES];
    [items release];
}

// Called when the view is shown again in the split view, invalidating the button and popover controller.
- (void)splitViewController:(UISplitViewController *)svc willShowViewController:(UIViewController *)aViewController invalidatingBarButtonItem:(UIBarButtonItem *)barButtonItem
{
    NSMutableArray *items = [[self.toolbar items] mutableCopy];
    [items removeObjectAtIndex:0];
    [self.toolbar setItems:items animated:YES];
    [items release];
}

在我的应用委托中,我有:

@property (nonatomic, retain) IBOutlet UISplitViewController *splitViewController;
@property (nonatomic, retain) IBOutlet DetailViewControlleriPad *rightViewController;
@property (nonatomic, retain) IBOutlet RootViewController * leftViewController;

而且这些属性都与 IB 挂钩。 RootViewController 推送到其他 tableviews,当它们在 popover 模式下被选中时需要关闭。

编辑

- (void)setDetailItem:(id)newDetailItem
{
    if (detailItem != newDetailItem)
    {
        [detailItem release];
        detailItem = [newDetailItem retain];
        [self.myTableView reloadData];
    }
}

【问题讨论】:

    标签: iphone objective-c cocoa-touch ipad uiview


    【解决方案1】:

    我总是不得不手动显式关闭弹出框。为此,请在将弹出视图控制器传递给我的 UISplitViewControllerDelegate 时获取对它的引用:

    - (void)splitViewController:(UISplitViewController*)svc 
         willHideViewController:(UIViewController *)aViewController 
              withBarButtonItem:(UIBarButtonItem*)barButtonItem 
           forPopoverController:(UIPopoverController*)pc
    {
        splitViewPopover = [pc retain];
        // Other stuff
    }
    

    因为我这样做了,所以我还必须在不再有效时释放引用:

    - (void)splitViewController:(UISplitViewController*)svc 
         willShowViewController:(UIViewController *)aViewController 
      invalidatingBarButtonItem:(UIBarButtonItem *)button 
    {    
        [splitViewPopover release];
        splitViewPopover = nil;
        // Other stuff
    }
    

    然后,当在我的主视图控制器中选择了一个项目时,我会更新我的细节控制器并关闭弹出框:

    [splitViewPopover dismissPopoverAnimated:NO];
    

    【讨论】:

    • 我通常所做的是在我的主应用程序委托中实现 UISplitViewControllerDelegate。然后我让应用程序委托将自己作为委托添加到主视图控制器。每当我的主视图控制器中发生应导致“选择”的事情时,它会通知其委托(主应用程序委托),从而解除弹出窗口。这样,只有应用程序委托需要有一个 splitViewPopover 引用。你也许可以做类似的事情。
    • 我实际上在我的详细 VC 中实现了这两种方法。那么在这种情况下,我是否必须手动将 splitViewPopover 向下传递到子表视图的层级?
    • 我不会:我会将该方法的实现上移到应用程序委托中。这样,应用代理可以“了解”主 VC 和详细 VC,并管理它们之间的交互。使用 Interface Builder 将应用控制器分配为主 VC 和详细 VC 的委托,并在需要时让它管理弹出框关闭。
    • 蒂姆,根据我发布的代码,我可以像您在代码中那样传递对象吗?
    • 假设当从弹出框进行选择时,您已经连接好通知详细视图控制器,您应该可以关闭您在 splitViewController:willHideViewController 方法中传递的弹出框。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-30
    • 1970-01-01
    • 2018-06-13
    相关资源
    最近更新 更多