2013-03-19 64 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