10

我正在构建一个表单集合,每个表单都包含多个字段。一些字段是UITextFields 将显示日期。我创建了一个名为 的新类DatePickerTextField,它是 的后代UITextField。当 aDatePickerTextField被点击时,我希望一个UIDatePicker控件出现在 a 中popover

我的问题是如何使用情节提要来实现popover?当场景中有特定的可见控件时,我可以进行转场。但是我如何popover在场景中表示一个可以附加到任何DatePickerTextField激活的实例的泛型呢?

4

5 回答 5

36

您可以创建未连接到任何控件的 segue,但我认为没有办法从代码中指定弹出框的锚点。另一种选择是创建不与任何 segue 连接的 ViewController。编辑情节提要时,创建将放置在弹出窗口中的 ViewController,选择它并导航到Utilities 窗格-> Attributes Inspector。将Size设置为Freeform,将Status Bar设置为None,指定将用于从代码中实例化 ViewController 的唯一标识符。现在您可以通过选择 ViewController 并导航到Utilities 窗格-> Size Inspector来更改 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];
}

需要注意的是,您需要将对 popover 的引用保留为类的 ivar,否则它将崩溃,因为 UIPopoverController 将在buttonPressed返回后被释放和释放:

@interface MyViewController : UIViewController {
//  ...
    UIPopoverController *popover;
//  ...
}
于 2012-06-22T20:33:00.807 回答
2

所以,我有一个类似的问题,如果其他人可能受益,我想我会分享它,因为我从 stackoverflow 中受益匪浅。

此解决方案允许您设置可自定义的弹出框 segue 的锚点。它还允许您将 segue 配置为模态或非模态(我找不到通过调暗外部上下文来防止 segue 的方法,所以如果有人知道如何做到这一点,我会有兴趣听到它);这是通过设置弹出框控制器的直通视图来完成的。我还添加了指定自定义视图的能力,而不是源视图控制器的视图(因为我需要这个能力);这部分对解决方案并不重要。

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 设置为“Custom”,并将 segue 类设置为“DynamicPopoverSegue”。在我的例子中,因为我想将它与视图中的动态层相关联,所以我无法设置锚点,所以我通过控制点击视图控制器下方栏中的视图控制器图标到我所在的视图控制器来创建 segue用于呈现弹出框。

要调用 popover 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;
   }
}
于 2014-09-04T16:27:31.633 回答
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];
}
于 2015-01-13T07:28:07.090 回答
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)
于 2015-07-25T15:47:10.520 回答
0

在场景停靠栏中添加一个 UIView。

您可以将其作为子视图添加到视图控制器上的任何现有视图。

然后,您可以根据需要切换它的 isHidden 属性。

您可以添加多个此类子视图并创建许多此类弹出窗口。

这种技术将使您免于设置新的 View Controller 和使用 segues。

于 2018-09-05T18:55:23.873 回答