2011-12-28 53 views
3

Possible Duplicate:
How to Dismiss a Storyboard PopoveriOS:如何关闭弹出

我有一个iPad故事板。将一个视图中的栏按钮项目拖动到另一个视图 - 并选择一个弹出窗口样式。当我按新酥料饼的观点是在酥料饼所示的按钮,但我有两个问题:

  1. 当我再次按下按钮,将显示酥料饼的视图的另一个实例 - 我可以看到,该黑色边框越来越黑暗。如果弹出窗口视图打开并按下按钮,弹出窗口视图应该关闭。我怎样才能做到这一点?
  2. 当前新的弹窗视图浮动到屏幕的按钮上,即使视图中的内容不高。我怎样才能控制popover视图的尺寸?

EDIT1:

我已经在控制器的从底部的黄色控制器图标拖动到另一个视图,这应该是酥料饼的内部产生一个SEGUE。这个弹出窗口的标识符是settingsPopover。

然后我做到这一点,IBAction为内部:

- (IBAction)settingsButtonTapped:(id)sender { 
     [self performSegueWithIdentifier:@"settingsPopover" sender:self]; 
} 

但是这给了我这个错误:

Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'UIStoryboardPopoverSegue must be presented from a bar button item or a view.'

有我创建了SEGUE在一个糟糕的方式或在调用performSegueWithIdentifier错了吗?

EDIT2:

我创造了这个IBAction为:

- (IBAction)settingsButtonTapped:(id)sender { 
    if (_settingsPopover == nil) { 
     SettingsViewController* settingsView = [[SettingsViewController alloc] initWithStyle:UITableViewStylePlain]; 
     self.settingsPopover = [[UIPopoverController alloc] initWithContentViewController:settingsView]; 
    } 
    [self.settingsPopover presentPopoverFromBarButtonItem:sender permittedArrowDirections:UIPopoverArrowDirectionAny animated:YES]; 
} 

它几乎工作,但一个缺点是,它是不是用我的故事板设计的UIView。例如,在我的故事板中,该视图将SettingsViewController类设计为分组表视图。有没有办法显示弹出窗口中的故事板而不是原始SettingsViewController实例中设计的UIView?

解决方案:

我创建了与标识 “settingsPopover” 故事板全球SEGUE。

- (IBAction)settingsButtonTapped:(id)sender { 
    if (self.settingsPopover==nil) { 
     [self performSegueWithIdentifier:@"settingsPopover" sender:sender]; 
    } 
} 

#pragma mark - UIView 
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {  
    if ([segue.identifier isEqualToString:@"settingsPopover"]) { 
     self.settingsPopover = [(UIStoryboardPopoverSegue *)segue popoverController]; 
     self.settingsPopover.delegate = self; 
    } 
} 

#pragma mark - UIPopoverControllerDelegate 
- (void)popoverControllerDidDismissPopover:(UIPopoverController *)popoverController { 
    self.settingsPopover = nil; 
} 

回答

1

每次执行Segue时,都会创建一个新的viewController,正如您在连接按钮以执行segue时所看到的那样。因此,您需要通过从viewController图标底部拖到目标位置来为viewController创建一个“通用”segue。然后,LucasTizma建议将按钮挂到IBAction,该按钮要么调用performSegueWithIdentifier:要么取消弹出,取决于弹出窗口是否在屏幕上。

1

故事板旨在成为一个通用的应用程序流和界面工具。他们从代码中抽取了很多常见的样板文件,以便您可以轻松查看高级别的情况。

不幸的是,你不能纯粹在故事板中捕捉到你想要的逻辑。就像Storyboards很乐意以模态方式呈现视图控制器一样,但不知道如何以模态方式解除视图控制器,故事板将呈现popover控制器,但它不能让您解除视图控制器。

  1. 而不是使用segue为此,只需为条形按钮创建一个自定义IBAction。如果存在弹出窗口,请跟踪该弹出窗口是否已呈现并将其解除。

  2. UIPopoverController有一个名为popoverContentSize的属性,可让您控制此属性。

2

I then do this inside the IBAction:

- (IBAction)settingsButtonTapped:(id)sender { 
     [self performSegueWithIdentifier:@"settingsPopover" sender:self]; 
} 

But this gives me this error:

Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'UIStoryboardPopoverSegue must be presented from a bar button item or a view.'

Have I created the segue in a bad way or in the call to performSegueWithIdentifier wrong?

你传递self代替sender(抽头按钮),当你调用-performSegueWithIdentifier:sender:即你给SEGUE一个UIViewController它需要一个UIBarButtonItemUIView

这应该工作:

- (IBAction)settingsButtonTapped:(id)sender { 
     [self performSegueWithIdentifier:@"settingsPopover" sender:sender]; 
} 
+0

我已经改变了发件人,但我仍然得到相同的异常。 – dhrm 2011-12-28 16:42:45

+0

我的错误。当他们以这种方式呈现时,popover segues也需要一个定位点。在界面构建器中和属性检查器中选择你的segue,将一个连接从锚字段拖到你的栏按钮项。看这[截图](http://cl.ly/Cv2O)。 – 2011-12-28 16:56:06

0

不同的解决方案是here。 segue将按钮动作更改为显示或关闭弹出窗口。