我有一个相对复杂的ui出现在一个popover中(复杂到足以从代码执行所有布局和关系会很痛苦),但是调用它的按钮被创建并放入父视图(存在于storyboard中) )来自代码。
我已经尝试从父视图的viewcontroller对象创建一个popover segue到popover内容vc,然后使用performSegueWithIdentifier触发它。这几乎可以工作,但我无法弄清楚如何从代码中设置popOver的锚点,使它出现在错误的位置(在屏幕底部压扁)。
有没有办法动态设置popOver segue的Anchor? 要么 我可以创建一个UIPopOverController对象并获取我在故事板中放入的视图吗? 要么 有没有其他明显的方法可以做到这一点,我没有看到?
请温柔,我是新来的。iPad iOS5.1 XCode4.3.2
答案 0 :(得分:8)
亚历,
我不完全确定我明白你要做什么,但让我从我认为理解的东西中捅出来。
出于同样的原因(引用复杂性等),我经常在故事板中构建我的视图,然后从某个动作加载它们。您可以做的是通过标识符实例化视图控制器,如下所示:
FancyViewController *controller = [[self storyboard]
instantiateViewControllerWithIdentifier:@"FancyViewController"];
这假设您已经创建了一个名为FancyViewController的UIViewController子类,并在故事板中为视图控制器设置了类型。
现在,您可以在弹出控制器中显示视图控制器,也可以将其推送到导航堆栈。您只需确保在故事板中为视图控制器设置标识符。
此外,如果您使用弹出控制器并且每次触发操作时只更新视图控制器属性,您可能希望实例化视图控制器一次。因此,如果它点击一个触发弹出窗口的按钮,您的代码可能如下所示:
- (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的显式操作。
我希望有所帮助。如果我误解了你想要做的事情,请告诉我。
最好的问候。