0

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

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

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

3 回答 3

1

从这里摘录:

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

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

于 2013-03-19T13:49:56.383 回答
0

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

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

于 2013-03-19T14:09:28.803 回答
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);
}

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

于 2013-03-19T13:56:43.897 回答