2012-06-22 54 views
10

我正在構建一個包含多個字段的表單集合。某些字段是UITextField,將顯示日期。我創建了一個名爲DatePickerTextField的新類,它是UITextField的後裔。當點擊一個DatePickerTextField時,我想要一個UIDatePicker控件出現在popover中。如何使用Storyboard來製作可用於代碼的彈出窗口?

我的問題是如何使用故事板來實現popover?當場景中存在特定的可見控件時,我可以做一個循環。但是,如何在場景中表示一個通用的popover,我可以將其附加到任何實例化的DatePickerTextField上,該變量將變爲活動的?

回答

36

您可以創建沒有連接到任何控件的segue,但我不認爲會有代碼爲popover指定錨點的方法。另一種選擇是創建不與任何segue連接的ViewController。編輯故事板時,創建將放置在彈出窗口中的ViewController,選擇它並導航到實用程序窗格 - >屬性檢查器。設置大小自由形式狀態欄,指定唯一標識符將用於從代碼實例化視圖控制器。現在,您可以通過選擇其視圖並導航到實用程序窗格 - >尺寸檢查器來更改ViewController的大小。

之後,你可以從代碼中創建酥料餅:

- (IBAction)buttonPressed:(id)sender { 
    UIView *anchor = sender; 
    UIViewController *viewControllerForPopover = 
     [self.storyboard instantiateViewControllerWithIdentifier:@"yourIdentifier"]; 

    popover = [[UIPopoverController alloc] 
       initWithContentViewController:viewControllerForPopover]; 
    [popover presentPopoverFromRect:anchor.frame 
          inView:anchor.superview 
      permittedArrowDirections:UIPopoverArrowDirectionAny animated:YES]; 
} 

一個需要注意的是,你需要持有參考酥料餅作爲你的類的實例變量,否則它會崩潰,因爲UIPopoverController將被釋放後釋放buttonPressed回報:

@interface MyViewController : UIViewController { 
// ... 
    UIPopoverController *popover; 
// ... 
} 
+2

感謝。正是我需要的。我將嘗試你的第一個想法,看看performSegueWithIdentifier調用的發送者是否成爲主播。如果這不起作用,我會與第二個想法一起去。 –

2

所以,我也有類似的問題,而在其他情況下可能受益,我想我會分享它,因爲我從計算器中受益這麼多。

該解決方案允許您設置可定製的popover segue的錨點。它也允許你將segue配置爲模態或不模擬(我無法通過調暗外部環境來找到防止延遲的方法,所以如果有人知道如何做到這一點,我會有興趣聽到它)。這是通過設置popover控制器的passthrough視圖來完成的。我還添加了指定自定義視圖的能力,而不是源視圖控制器的視圖(因爲我需要此容量);這部分對解決方案並不重要。

DynamicPopoverSegue.h

@interface DynamicPopoverSegue : UIStoryboardPopoverSegue 

@property BOOL isModal; 
@property UIView* sourceView; 
@property CGRect anchor; 

@end 

DynamicPopoverSegue.m

@implementation DynamicPopoverSegue 

- (void)perform 
{ 
    if (!self.popoverController.popoverVisible) 
    { 
     UIViewController* dst = (UIViewController*)self.destinationViewController; 
     UIViewController* src = (UIViewController*)self.sourceViewController; 

     UIView* inView = _sourceView ? _sourceView : src.view; 

     self.popoverController.contentViewController = dst; 
     if (!_isModal) 
     { 
     [self.popoverController setPassthroughViews:[[NSArray alloc] initWithObjects:inView, nil]]; 
     } 
     [self.popoverController presentPopoverFromRect:_anchor 
               inView:inView 
          permittedArrowDirections:UIPopoverArrowDirectionAny 
              animated:YES]; 
    } 
} 

@end 

然後你只需設置你順着接下去的故事板 「自定義」,並設置SEGUE類 「DynamicPopoverSegue」。在我的情況下,因爲我想將它與視圖中的動態圖層相關聯,所以我無法設置錨點,所以我通過從視圖控制器下方的視圖控制器圖標點擊控制器到視圖控制器來創建segue,用於呈現彈出式菜單。

要調用酥料餅SEGUE:

[self performSegueWithIdentifier:@"MyPopoverSegue" sender:self]; 

並配置酥料餅SEGUE:

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender 
{ 
    if ([[segue identifier] isEqualToString:@"MyPopoverSegue"]) 
    { 
     DynamicPopoverSegue* popoverSegue = (DynamicPopoverSegue*)segue; 
     // set the anchor to wherever you want it to be 
     popoverSegue.anchor = _destinationFrame; 
    } 
} 
+0

這對我來說不起作用:一旦彈出窗口顯示,觸摸它外面不會像它應該關閉它 – xaphod

0
- (IBAction)pressItemChooseOprateRoom:(id)sender { 
    if (isPad){ 
     // UIView *anchor = sender; 
     UIViewController *viewControllerForPopover = 
     [self.storyboard instantiateViewControllerWithIdentifier:@"OperateRoomList"]; 

     _myPopover = [[UIPopoverController alloc] 
         initWithContentViewController:viewControllerForPopover]; 

     CGRect rc=[self getBarItemRc:sender]; 
     [_myPopover presentPopoverFromRect:rc 
            inView:self.view 
        permittedArrowDirections:UIPopoverArrowDirectionAny animated:YES]; 

     [MLControl shared].popover =self; 
     // [self perfformSegueWithIdentifier:SEGUE_POP_OPERATEROOM sender:self]; 
    }else{ 
     [self iphoneOpenOperateRoomList]; 
     /* [self performSegueWithIdentifier:@"iPhonePushOperateRoom" sender:self]; 
     */ 
    } 
} 

-(void)iphoneOpenOperateRoomList{ 
    UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main" bundle:nil]; 
    UIViewController *vc = [storyboard instantiateViewControllerWithIdentifier:@"OperateRoomList"]; 
    //  if (!index.showTabBar) { 
    //   vc.hidesBottomBarWhenPushed = YES; 
    //  } 

    [self.navigationController pushViewController:vc animated:YES]; 
} 
0

只是用來從Jonnywho回答我的SWIFT項目。如果你需要它:

這裏的SWIFT版本:

let anchor: UIView = sender 
    var viewControllerForPopover = self.storyboard?.instantiateViewControllerWithIdentifier("GameAboutViewController") as! UIViewController? 


    let popover = UIPopoverController(contentViewController: viewControllerForPopover!) 
    popover.presentPopoverFromRect(anchor.frame, inView: anchor, permittedArrowDirections: UIPopoverArrowDirection.Any, animated: true) 
相關問題