在Storyboard中布局视图然后从代码中加载到PopOver中?

时间:2012-06-04 21:27:44

标签: ipad ios5 storyboard uipopovercontroller

我有一个相对复杂的ui出现在一个popover中(复杂到足以从代码执行所有布局和关系会很痛苦),但是调用它的按钮被创建并放入父视图(存在于storyboard中) )来自代码。

我已经尝试从父视图的viewcontroller对象创建一个popover segue到popover内容vc,然后使用performSegueWithIdentifier触发它。这几乎可以工作,但我无法弄清楚如何从代码中设置popOver的锚点,使它出现在错误的位置(在屏幕底部压扁)。

有没有办法动态设置popOver segue的Anchor? 要么 我可以创建一个UIPopOverController对象并获取我在故事板中放入的视图吗? 要么 有没有其他明显的方法可以做到这一点,我没有看到?

请温柔,我是新来的。

iPad iOS5.1 XCode4.3.2

1 个答案:

答案 0 :(得分:8)

亚历,

我不完全确定我明白你要做什么,但让我从我认为理解的东西中捅出来。

出于同样的原因(引用复杂性等),我经常在故事板中构建我的视图,然后从某个动作加载它们。您可以做的是通过标识符实例化视图控制器,如下所示:

FancyViewController *controller = [[self storyboard] 
              instantiateViewControllerWithIdentifier:@"FancyViewController"];

这假设您已经创建了一个名为FancyViewController的UIViewController子类,并在故事板中为视图控制器设置了类型。

现在,您可以在弹出控制器中显示视图控制器,也可以将其推送到导航堆栈。您只需确保在故事板中为视图控制器设置标识符。

enter image description here

此外,如果您使用弹出控制器并且每次触发操作时只更新视图控制器属性,您可能希望实例化视图控制器一次。因此,如果它点击一个触发弹出窗口的按钮,您的代码可能如下所示:

- (IBAction)didTapButtonToShowFancyViewController:(id)sender
{
  if (![self fancyViewController])
  {
    // fancyViewContrller is a property of type FancyViewController *
    fancyViewController = [[[self storyboard]
          instantiateViewControllerWithIdentifier:@"FancyViewController"];

    // fancyViewPopoverController is also a property
    fancyViewPopoverController = [[UIPopoverController alloc] 
                  initWithContentViewController:fancyViewController];
  }

  // Perform setup on the fancy controller you want to do every
  // time the action gets triggered here. Do initialization in the if
  // block above.

  // Now display the popover from the sender's frame. I'm assuming the
  // sender is a UIButton.
  [fancyViewPopoverController presentPopoverFromRect:[sender valueForKey:@"frame"] 
                              inView:[self view] 
              permittedArrowDirections:UIPopoverArrowDirectionAny animated:YES];

}

动态设置popover“锚点”的唯一方法是使用一个调用presentPopoverFromRect:permittedArrowDirections:animated:而不是segue的显式操作。

我希望有所帮助。如果我误解了你想要做的事情,请告诉我。

最好的问候。