【问题标题】:Is there a way to distinguish between which UIPopOver is dismissed?有没有办法区分哪个 UIPopOver 被解雇了?
【发布时间】:2013-03-19 23:34:46
【问题描述】:

我的应用程序中有几个弹出框,我很难确定哪个弹出框被忽略了。是否有与 UIPopOvers 等效的“标签”功能?

我可以在 popoverContorllerDidDismissPopover 方法中NSLog popoverController 并查看每个的内存引用,但这无济于事。

#pragma mark - Popover controller delegates
- (void)popoverControllerDidDismissPopover:(UIPopoverController *)popoverController {
    NSLog(@"Popover dismised %@", popoverController);
}

【问题讨论】:

  • 也许您可以将UIPopOverController 与块一起使用?这样你就不必关心这些了。
  • 你想达到什么目的?
  • 我的目标是当一个特定的弹出框被关闭时,我可以更新几个不同的按钮状态。但直到弹出窗口被解除之后。是的,我可以根据更改的内容不断更新按钮状态,但这不是我的要求。
  • 我认为在这种情况下您可能需要考虑使用委托。

标签: ios objective-c uipopovercontroller uipopover


【解决方案1】:

here 的摘录:

如果我理解了这个问题,那么基本上,不——这很让人抓狂。 一方面,你被告知只有一个弹出窗口应该显示在 任何一刻。另一方面,您不会自动获得 引用该弹出框。因此,您可以存储参考, 手动,在它显示它的时候到当前的popover控制器 popover,以便您稍后可以与它交谈以将其关闭。 Popover 控制器管理因此可以变得非常精细,并且 笨拙;你正在做系统应该做的各种工作 为你做事。

iOS 的这种方式很有趣。我想起了在 iOS 4 中是如何没有来电的 告诉你当前的第一响应者。显然系统知道 第一响应者是什么,为什么不告诉你?这是一种 哑的。这是相似的;系统清楚地知道有用的东西,它不会 与你分享。米。

【讨论】:

  • 根据 HIG,只应显示一个弹出框...其余您已经猜到了。
  • 我真的不明白持有对已呈现的弹出框的引用的问题。对于每个弹出框,您只需存储一个引用并检查 DidDismiss 中的引用。我是否从问题中遗漏了更多内容?
  • @John 你是绝对正确的。然而,引入一个新的状态变量并不总是最好的解决方案。在一个复杂的 iPad 应用程序中,您可以在同一个屏幕上显示许多不同的弹出框,如果您在一个委托方法中处理它们,您最终会得到一个大的 switchif-else 比较弹出框类型。最好删除 switch 并移动到更靠近创建弹出框的代码的关闭处理程序,例如使用块(检查我的答案)。
【解决方案2】:

有很多方法可以区分弹出框。我将列出其中的几个:

  1. 您在询问tag。请注意,每个弹出框都有一个内容视图控制器,并且此控制器有一个可以标记的视图。然而,使用魔术整数标签来区分视图通常是有争议的。

  2. 将弹出框的类型存储到控制器中的变量/属性中,例如作为enum。这是最简单的方法。

  3. 将必要的信息添加到弹出框,但要聪明,例如

@interface MyPopoverController : UIPopoverController 

@property (nonatomic, copy, readwrite) void (^dissmissHandler)(void);

@end

@implementation MyPopoverController 

- (id)initWithContentViewController:(UIViewController*)contentView {
   self = [super initWithContentViewController:contentView];

   if (!self) {
      return nil;
   }

   self.delegate = self;

   return self;
}

- (void)popoverControllerDidDismissPopover:(UIPopoverController*)popover {
    assert(popover == self);

    if (self.dissmissHandler) {
       self.dissmissHandler();
    }
}

@end

MyPopoverController* popover = [MyPopoverController alloc] initWithContentViewController:...];
popover.dissmissHandler = ^{
   ...
};

【讨论】:

  • (为 MRC 添加 autoreleasedealloc
  • 块对我来说仍然是一个非常抽象的概念。
  • @JasonBourne Okey,但您迟早必须了解它们。这不是我列出的唯一选项。
【解决方案3】:

正如@Anoop 所说,您通常一次只能显示一个弹出窗口。

一种可能的解决方案是检查弹出窗口上的contentViewController 属性。如果您要存储每个视图控制器的引用,您可以执行以下操作:

- (void)popoverControllerDidDismissPopover:(UIPopoverController *)popoverController {
    if ( popoverController.contentViewController == self.someUIViewController ) {
        // do stuff
    }
    else if ( popoverController.contentViewController == someoTherViewController ) {
       //
    }
    NSLog(@"Popover dismised %@", popoverController);
}

如果无法存储对每个内容视图控制器的引用(或者可能不是一个好主意),您可以随时检查其类型:

- (void)popoverControllerDidDismissPopover:(UIPopoverController *)popoverController {
    if ( [popoverController.contentViewController isKindOfClass:[MyAwesomeViewController class]] ) {
        // do stuff
    }
    else if ( [popoverController.contentViewController isKindOfClass:[MyOtherViewController class]] ) {
        //
    }
    NSLog(@"Popover dismised %@", popoverController);
}

另一种可能的解决方案(从设计的角度来看可能更好)是将委托传递给包含在弹出窗口中的视图控制器。 More here。这样,显示的视图控制器可以将数据发送回您的主视图控制器。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-28
    • 2015-10-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多