如何使用Storyboard制作可在代码中使用的popover?

Dav*_*d U 10 xcode storyboard popover

我正在构建一个表单集合,每个表单包含几个字段.某些字段是UITextField显示日期的字段.我创建了一个名为DatePickerTextField的后代,一个后代UITextField.当点击a时DatePickerTextField,我希望UIDatePicker控件出现在popover.

我的问题是如何使用故事板来实现popover?当场景中有特定的可见控件时,我可以做一个segue.但是,如何popover在场景中表示我可以附加到任何DatePickerTextField变为活动的实例化的泛型?

Joh*_*who 36

您可以创建未连接到任何控件的segue,但我认为没有办法为代码中的弹出窗口指定锚点.另一种选择是创建未与任何segue连接的ViewController.编辑故事板时,创建将放置在弹出窗口中的ViewController,选择它并导航到Utilities窗格 - > Attributes Inspector.将Size设置为Freeform,Status Bar设置None,指定将用于从代码实例化ViewController的唯一标识符.现在,您可以通过选择View并导航到Utilities窗格 - > Size Inspector来更改ViewController的大小.

之后,您可以从代码创建popover:

- (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];
}
Run Code Online (Sandbox Code Playgroud)

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

@interface MyViewController : UIViewController {
//  ...
    UIPopoverController *popover;
//  ...
}
Run Code Online (Sandbox Code Playgroud)

  • 谢谢.正是我需要的.我将尝试你的第一个想法,看看performSegueWithIdentifier调用的发送者是否成为锚点.如果这不起作用,我会选择第二个想法. (2认同)