有没有办法区分哪个UIPopOver被解雇?

时间:2013-03-19 13:43:46

标签: ios objective-c uipopovercontroller uipopover

我的应用程序中有几个弹出窗口,我很难确定哪个弹出窗口被解雇了。是否有与UIPopOvers等效的“标记”功能?

我可以在popoverContorllerDidDismissPopover方法中NSLog popoverController并查看每个方法的内存引用,但这没有帮助。

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

3 个答案:

答案 0 :(得分:1)

here的摘录:

  

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

     

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

答案 1 :(得分:0)

正如@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);
}

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

答案 2 :(得分:0)

如何区分弹出窗口有很多方法。我将列出其中几个:

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

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

  3. 将必要的信息添加到popover中,但要聪明一点,例如

  4. @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 = ^{
       ...
    };