iOS:如何消除弹出框[重复]

     2023-03-13     121

关键词:

【中文标题】iOS:如何消除弹出框[重复]【英文标题】:iOS: how to dismiss popovers [duplicate] 【发布时间】:2011-12-28 13:13:04 【问题描述】:

可能重复:How to Dismiss a Storyboard Popover

我有一个 iPad 故事板。一个视图中的条形按钮项被 Control 拖动到另一个视图 - 并且选择了弹出框样式。当我按下按钮时,新的弹出窗口视图会显示在弹出窗口中,但我有两个问题:

    当我再次按下按钮时,会显示另一个弹出视图实例——我可以看到,黑色边框越来越暗。如果弹出视图打开并且我按下按钮,弹出视图应该关闭。我该怎么做? 目前,即使视图中的内容没有那么高,新的弹出视图也会浮动到屏幕的按钮上。如何控制弹出视图的尺寸?

EDIT1:

我通过从控制器底部的黄色控制器图标拖动到另一个视图(应该在弹出框内)创建了一个 segue。此弹出框的标识符是 settingsPopover。

然后我在 IBAction 中执行此操作:

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

但这给了我这个错误:

由于未捕获的异常而终止应用程序 'NSInternalInconsistencyException',原因:'UIStoryboardPopoverSegue 必须从条形按钮项或视图中呈现。'

我是否以错误的方式或在调用 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];

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

解决方案:

我在 Storyboard 中使用标识符“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】:

然后我在 IBAction 中执行此操作:

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

但这给了我这个错误:

由于未捕获的异常而终止应用 'NSInternalInconsistencyException',原因:'UIStoryboardPopoverSegue 必须从条形按钮项或视图中呈现。'

我是否以错误的方式或在调用 performSegueWithIdentifier 错误?

当您调用-performSegueWithIdentifier:sender: 时,您传递的是self 而不是sender(点击的按钮),也就是说,您给segue 一个UIViewController,它期望一个UIBarButtonItemUIView

这应该可行:

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

【讨论】:

我更改了发件人,但仍然遇到同样的异常。 我的错误。 Popover segues 在以这种方式呈现时也需要一个锚点。在界面生成器和属性检查器中选择您的转场,将连接从锚字段拖到您的栏按钮项。看到这个screenshot。【参考方案2】:

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

【讨论】:

【参考方案3】:

Storyboards 是一种通用的应用流程和界面工具。它们从您的代码中抽象出许多常见的样板,因此您可以轻松地从高层次上了解正在发生的事情。

很遗憾,您无法在 Storyboard 中完全捕捉到您想要的逻辑。就像 Storyboards 很乐意以模态方式将视图控制器呈现为 segue 但不知道以模态方式关闭视图控制器一样,Storyboards 将呈现弹出框控制器,但它不提供您关闭它们的能力。

    不要为此使用segue,只需为栏按钮创建一个自定义IBAction。跟踪是否显示了弹出框,如果是,则在此方法中将其关闭。

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

【讨论】:

【参考方案4】:

另一种解决方案是here。 segue 将按钮操作更改为显示或关闭弹出窗口。

【讨论】:

iOS UITesting 如何关闭弹出框(iPad 弹出框不提醒样式)

】iOSUITesting如何关闭弹出框(iPad弹出框不提醒样式)【英文标题】:iOSUITestingHowtoDismissPopover(iPadPopoverNOTAlertStyle)【发布时间】:2017-01-2708:59:48【问题描述】:我有一个非常复杂的应用程序,其中包含大量视图和弹出框,用于快... 查看详情

iOS:当视图位于弹出框后面时,我如何注意到?

】iOS:当视图位于弹出框后面时,我如何注意到?【英文标题】:iOS:HowdoInoticewhenaviewisbehindapopover?【发布时间】:2016-10-2713:11:37【问题描述】:在我的应用程序中,我显示了一个弹出框,这会导致弹出框后面的所有着色UIImageViews... 查看详情

如何在 iOS 6 中使用 UIPopoverBackgroundView 呈现透明弹出框

】如何在iOS6中使用UIPopoverBackgroundView呈现透明弹出框【英文标题】:HowtouseUIPopoverBackgroundViewtopresentatransparentpopoveriniOS6【发布时间】:2013-03-3009:48:07【问题描述】:我在iOS6中使用UIPopoverController来呈现UITableViewController。我正在尝... 查看详情

如何在 iPhone、iOS 8 上为弹出框设置动画

】如何在iPhone、iOS8上为弹出框设置动画【英文标题】:HowtoanimateapopoveroniPhone,iOS8【发布时间】:2015-03-1922:20:21【问题描述】:我在按钮单击时出现了一个弹出框,但它没有动画。我希望它从零大小开始,并成长为类似于facebooks... 查看详情

仅当在 iOS 7 弹出框内使用视图时,如何使视图背景透明?

】仅当在iOS7弹出框内使用视图时,如何使视图背景透明?【英文标题】:HowtomaketheviewbackgroundtransparentonlyiftheviewisusedinsideaniOS7popover?【发布时间】:2014-01-2713:30:05【问题描述】:iOS7HIG说:(默认情况下,弹出窗口中的表格视图、... 查看详情

在 iOS 8 中呈现弹出框时如何使屏幕模糊

】在iOS8中呈现弹出框时如何使屏幕模糊【英文标题】:HowdoIgetthethescreentoBlurwhenpresentingapopoveriniOS8【发布时间】:2014-09-2919:00:21【问题描述】:在WWDC2014上的“iOS8中的ViewController进步”演讲中,在幻灯片#114上,它展示了在iPhone上... 查看详情

如何以编程方式关闭/禁用 iOS 11 中引入的屏幕截图弹出框?

】如何以编程方式关闭/禁用iOS11中引入的屏幕截图弹出框?【英文标题】:HowcanIprogrammaticallydismiss/disablethescreenshotpopoverthatwasintroducediniOS11?【发布时间】:2017-06-1112:39:17【问题描述】:在我的应用程序中,我具有检测用户何时截... 查看详情

在 didSelectRowAtIndexPath 上关闭 ios 中的弹出框

...航栏按钮上弹出,并且该弹出框包含一个表格视图。ios中如何在tableview的didSelectRowAtIndexPath方法上关闭popover?【问题讨论】:你能在你弹出P 查看详情

如何关闭 iPhone 5 iOS 6 中的弹出框?

】如何关闭iPhone5iOS6中的弹出框?【英文标题】:HowtodismissapopoveriniPhone5iOS6?【发布时间】:2013-07-1219:34:36【问题描述】:当我的iPhone5应用启动时,我没有显示视图控制器,原因如下:-(void)viewDidAppear:(BOOL)animated用户要做的第一件... 查看详情

IOS:用表格视图填充弹出框

...rwithatableview【发布时间】:2011-05-3109:24:13【问题描述】:如何创建一个弹出框并用表格视图填充它?我在视图底部的工具栏上有一个按钮,当我按下此按钮时,我想显示此弹出框【问题讨论】:【参考方案1】:创建pushviewcontrolle... 查看详情

ios:从子viewController获取父弹出框的大小?

...我有一个视图控制器,它显示在弹出框内。我试图弄清楚如何调整viewController的视图(viewController的self.view)以匹配弹出框。我认为视图会自动调整大小以适应弹出框;出于 查看详情

在 iOS8 中检测弹出框关闭

...用户可以通过触摸弹出框右侧的某个位置来关闭弹出框。如何在iOS8中检测到弹出框已关闭?在iOS7中,我可以只使 查看详情

XCUITest 如何关闭日期选择器弹出框

】XCUITest如何关闭日期选择器弹出框【英文标题】:XCUITestHowtodismissdatepickerpopover【发布时间】:2021-12-1110:08:14【问题描述】:在iOS15中,我的应用中有一个日期选择器,它使用.compact样式,因此它将日期和时间选择UI显示为弹出框... 查看详情

如何使用 UIMenuController iOS5.1 防止 UITextView 上的复制/粘贴/选择弹出框

】如何使用UIMenuControlleriOS5.1防止UITextView上的复制/粘贴/选择弹出框【英文标题】:HowdoPreventacopy/paste/selectpopoveronaUITextViewusingUIMenuControlleriOS5.1【发布时间】:2014-07-0115:30:58【问题描述】:问题:如何防止出现在UITextView上的复制/... 查看详情

弹出框关闭后如何在 transitionCoordinator 中安排新的演示文稿

】弹出框关闭后如何在transitionCoordinator中安排新的演示文稿【英文标题】:HowcanIscheduleanewpresentationintransitionCoordinatorafterpopoverdismissal【发布时间】:2014-11-0521:00:59【问题描述】:我正在更新我的应用程序以支持iOS8。在某些地方... 查看详情

如何在表格视图的 didSelect 上显示弹出框

】如何在表格视图的didSelect上显示弹出框【英文标题】:HowtoshowpopoverondidSelectoftableview【发布时间】:2018-07-2009:56:57【问题描述】:我想在我的tableview上实现这种类型的视图并选择。这是一个使用swift编程的iOS项目..效果类似于wha... 查看详情

iOS 弹出框在关闭后不会消失

】iOS弹出框在关闭后不会消失【英文标题】:iOSPopoverDoesNotGoAwayAfterDismiss【发布时间】:2018-12-3105:48:13【问题描述】:我们有一个视图控制器在单击时显示来自UIBarButtonItem的弹出窗口。弹出框显示得很好,但是当我们单击弹出框... 查看详情

单击外部弹出框时如何防止 UIPopoverPresentationController 被关闭?

】单击外部弹出框时如何防止UIPopoverPresentationController被关闭?【英文标题】:HowtopreventUIPopoverPresentationControllerfrombeingdismissedwhenclickingoutsidepopover?【发布时间】:2015-07-0817:07:58【问题描述】:在我的通用iOS8应用程序中,我使用UIP... 查看详情