2013-03-19 43 views
0

我在应用程序中有几个弹出窗口,我很难确定哪个popover被解雇。是否有与UIPopOvers等效的“标签”功能?有没有办法区分哪个UIPopOver被解雇?

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

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

也许你可以使用'UIPopOverController'积木?这样你就不必关心这一点。 – Peres 2013-03-19 13:47:40

+0

你想要达到什么目标? – 2013-03-19 13:59:10

+0

我的目标是,当某个特定的popover被解雇时,我可以更新几个不同的按钮状态。但是直到流行病被解雇之后。是的,我可以不断更新按钮状态,无论什么改变,但这不是我的要求。 – JasonBourne 2013-03-19 14:22:24

回答

1

的提取物here

如果我理解这个问题的话,基本上,没有 - 这是令人发狂。 一方面你会被告知只有一个弹出窗口应该在任何时刻显示在 。另一方面,您不会自动获得对该弹出窗口的引用 。因此,您需要手动将参考号 存储到当前的popover控制器中,以便在弹出控制器显示其弹出时弹出 时间,以便您稍后可以与它对话以解除它。 Popover控制器管理因此可以得到非常详细的和笨拙的;你正在做各种工作,系统应该是 为你做的。

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

+0

这非常令人失望。任何关于工作的想法? – JasonBourne 2013-03-19 13:53:14

+0

根据HIG,应该只显示一个弹出窗口...您已经猜到的休息。 – 2013-03-19 13:55:21

+2

我真的不明白这个问题,因为我们已经提到了弹出窗口的引用。对于每个popover,您只需存储一个参考,并在DidDismiss中检查参考。我是否错过了更多的问题? – John 2013-03-19 14:14:37

0

正如@Anoop所说的,通常每次只能显示一个popover。

一个可能的解决方案是检查弹出的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。这样,显示的视图控制器可以将数据发送回您的主视图控制器。

0

如何区分pop There有很多方法。我将列出其中几个:

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

+0

(为MRC添加'autorelease'和'dealloc') – Sulthan 2013-03-19 14:13:08

+0

块对我来说仍然是一个非常抽象的概念。 – JasonBourne 2013-03-19 14:23:44

+0

@JasonBourne Okey,但迟早你必须了解它们。这不是我列出的唯一选项。 – Sulthan 2013-03-19 14:43:04