3

我有相对复杂的 ui 出现在弹出窗口中(足够复杂,从代码中完成所有布局和关系会很痛苦),但是调用它的按钮是从代码创建并放置到父视图(存在于情节提要中)中的.

我尝试过从父视图的 viewcontroller 对象到弹出内容 vc 的弹出框 segue,然后使用 performSegueWithIdentifier 触发它。这几乎可行,但我不知道如何从代码中设置 popOver 的 Anchor,使其出现在错误的位置(在屏幕底部被挤压)。

有没有办法动态设置popOver segue的锚点?或者我可以创建一个 UIPopOverController 对象并将我在情节提要中放在一起的视图放入其中吗?还是有其他一些我没有看到的明显方法来做到这一点?

请温柔,我是新来的。

iPad iOS5.1 XCode4.3.2

4

1 回答 1

8

亚历克斯,

我不完全确定我理解你想要做什么,但让我从我认为我理解的内容中尝试一下。

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

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

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

现在,您可以在弹出控制器中显示视图控制器,也可以将其推送到导航堆栈上。您只需要确保已在情节提要中设置了视图控制器的标识符。

在此处输入图像描述

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

- (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];

}

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

我希望这会有所帮助。如果我误解了您要执行的操作,请告诉我。

最好的祝福。

于 2012-06-05T17:46:40.760 回答