2012-08-07 78 views
2

我正在写一个iPad应用程序,并且我的一个屏幕上有很多小按钮,当按下它们时,会在源自该按钮的弹出窗口中显示一个文本句子。目前,所有popovers使用故事板创建和我酥料饼的控制器在我UIViewController存储为这样:有无论如何知道popover是从哪里来的?

@property (nonatomic, strong) UIPopoverController *myPopoverController; 

- (void) prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender 
{ 
    if ([segue isKindOfClass:[UIStoryboardPopoverSegue class]]) 
    { 
     UIStoryboardPopoverSegue *popoverSegue = (UIStoryboardPopoverSegue *)segue; 
     self.myPopoverController = popoverSegue.popoverController; 
    } 
} 

不过,我想不出一个好办法来处理旋转。右键我的didRotate方法看起来像这样:

- (void) didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation 
{ 
    if (self.myPopoverController) 
    { 
     [self.myPopoverController dismissPopoverAnimated: NO]; 
     [self.myPopoverController presentPopoverFromRect:?????? inView:self.view permittedArrowDirections:UIPopoverArrowDirectionDown animated:NO]; 
    } 
} 

不过,我不知道从哪里因为他们可能起源于任何我的屏幕上的小按钮的呈现popovers。有什么建议么?请记住,这些是非常简单的弹出窗口,因此一大堆新代码并不理想。

回答

1

您最好的选择可能是在您的主视图控制器中创建另一个属性,以保持对按钮的引用。喜欢的东西:

@property (nonatomic, strong) UIPopoverController *myPopoverController; 
@property (nonatomic, weak) UIView *popoverButton; 

- (void) prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender 
{ 
    if ([segue isKindOfClass:[UIStoryboardPopoverSegue class]]) 
    { 
     UIStoryboardPopoverSegue *popoverSegue = (UIStoryboardPopoverSegue *)segue; 
     self.myPopoverController = popoverSegue.popoverController; 

     //The sender in prepareForSegue should be the view used to initiate the segue. 
     popoverButton = (UIView *)sender; 
    } 
} 

上述工作完成后,你可以正是如此修改循环代码:

- (void) didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation 
{ 
    if (self.myPopoverController) 
    { 
     [self.myPopoverController dismissPopoverAnimated: NO]; 
     [self.myPopoverController presentPopoverFromRect:popoverButton.frame inView:self.view permittedArrowDirections:UIPopoverArrowDirectionDown animated:NO]; 
    } 
} 

保持一个参考按下按钮,不占用更多的资源存储指针,并保持基准弱应该避免保留周期(毕竟,你的视图控制器不拥有按钮,按钮的超级视图拥有它)。