2012-08-07 31 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]; 
    } 
} 

保持一個參考按下按鈕,不佔用更多的資源存儲指針,並保持基準弱應該避免保留週期(畢竟,你的視圖控制器不擁有按鈕,按鈕的超級視圖擁有它)。