iOS:关闭使用界面生成器生成的弹出框,并在弹出框内使用按钮

     2023-03-13     284

关键词:

【中文标题】iOS:关闭使用界面生成器生成的弹出框,并在弹出框内使用按钮【英文标题】:iOS: dismiss popOver generated with Interface Builder with button within the popOver 【发布时间】:2013-05-29 12:29:12 【问题描述】:

我有一个通向 popOver 的按钮,所有这些都是在 Interface Builder 中创建的。当我按下它外面的某个地方时,popOver 会关闭,但我还想在 popOver 内实现一个按钮。

我找到了 Giorgio Barchiesi 可追溯到 2011 年的解决方案,但我未能实施。这是他的解决方案:

在源视图控制器的实现文件中:

-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender

    if ([[segue destinationViewController] isKindOfClass:[MyDestViewController class]]) 
        MyDestViewController* viewController = (MyDestViewController*)[segue destinationViewController];
        UIStoryboardPopoverSegue* popoverSegue = (UIStoryboardPopoverSegue*)segue;
        [viewController setPopoverController:[popoverSegue popoverController]];
    

在目标视图控制器的头文件中:

@property (weak, nonatomic) UIPopoverController* popoverController;

在目标视图控制器的实现文件中:

@synthesize popoverController;

相同的文件,只要你想关闭弹出框:

[popoverController dismissPopoverAnimated:YES];

按下按钮时我可以调用最后一个函数。 我的问题是 XCode 在 [viewController setPopoverController:[popoverSegue popoverController]] 行上给了我一个错误:ARC 语义问题:选择器“setPopOverController”没有已知的类方法

我错过了什么?

【问题讨论】:

【参考方案1】:

这是我使用的方法:

打开你的故事板文件,选择segue箭头并打开属性检查器(Option - Command - 4)和标识符填写一个合理的名称,如“myPopoverSegue”。

在您的源视图控制器中,在 @implementation 之后定义一个变量:

@implementation ViewController

    __weak UIPopoverController *myPopover;

然后,再次在源 VC 中:

-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
    if ([segue.identifier isEqualToString:[dict objectForKey:@"myPopoverSegue"]]) //@"segue" is your segue name. You can use isKindOfClass as you do currently, I prefer this method.
        myPopover = [(UIStoryboardPopoverSegue *)segue popoverController];
    


-(void)closePopover
    [myPopover dismissPopoverAnimated:YES];

在你的 Source VC 的 viewDidLoad 方法的最后写:

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(closePopover) name:@"popoverShouldDismiss" object:nil];

最后,每当您想关闭弹出框时:

 [[NSNotificationCenter defaultCenter] postNotificationName:@"popoverShouldDismiss" object:nil];

希望这会有所帮助! 这样,您还可以在不更改代码的情况下将 segue 更改为不同的控制器。

【讨论】:

【参考方案2】:

您可以将委托 添加到您的类并覆盖委托方法:

 - (BOOL)popoverControllerShouldDismissPopover:(UIPopoverController *)popoverController
 
     return NO;
 

当用户按下屏幕上的任何位置时,这将防止弹出框消失。 现在您可以使用以下方法关闭按钮选择器方法中的弹出框:

  [popoverController dismissPopoverAnimated:YES];

【讨论】:

谢谢你,但我没有问当用户推到它外面时如何停止关闭popOver。相反,我问如何从 popOver 中的按钮关闭它? 你在调用类似的方法吗:[popoverControllerdismissPopoverAnimated:YES];在按钮的选择器方法如 -(IBAction) buttonPressed [popoverController dismissPopoverAnimated:YES];这不工作吗? 是的,我是。问题是 popoverController 不能仅仅关闭它自己。它需要来自它的根视图的引用,这是用户 chandan 试图解决的问题,但我一定忘记了一些东西,因为它不起作用......【参考方案3】:

在 iOS 8 中,这真的很容易。打个电话就行了

[self dismissViewControllerAnimated:YES completion:^];

弹出框是常规的演示控制器,因此它或多或少与模态视图控制器完全相同。

【讨论】:

这绝对是正确的方法。我以这种方式创建了一个链接到按钮的IBAction- (IBAction)pressedCloseButton:(id)sender [self dismissViewControllerAnimated:YES completion:nil]; 【参考方案4】:

试试这个代码

-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender

    if ([[segue destinationViewController] isKindOfClass:[MyDestViewController class]]) 
    
        MyDestViewController* viewController = (MyDestViewController*)[segue destinationViewController];

        UIStoryboardPopoverSegue* popoverSegue = (UIStoryboardPopoverSegue*)segue;

        popoverSegue.popoverController=[[UIPopoverController alloc] initWithContentViewController:viewController];

        [popoverSegue.popoverController setPopoverContentSize:CGSizeMake(viewController.view.frame.size.width, viewController.view.frame.size.height)];

        popoverSegue.popoverController.delegate=self;

        [viewController setPopoverController:popoverSegue.popoverController];
    

希望对你有帮助。

【讨论】:

感谢您的快速回复,但在我的情况下不起作用。当我尝试设置popoverSegue.popoverController=[[UIPopoverController alloc] initWithContentViewController:viewController]; 方法时,我无法在那里设置我的根ViewController (意外的接口名称'ViewController'),它仍然在setPopOverController 函数上返回相同的错误。我是否必须在 .h 文件中为我的 ViewControllers 设置一个属性?

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

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

Twitter Bootstrap 弹出框不适用于动态生成的内容

...所以如果我在这里搞砸了任何事情,我提前道歉。我正在使用TwitterBootstrap的弹出框。我的弹出框似乎适用于我手动输入到我的HTML文档中的元素 查看详情

试图关闭故事板呈现的弹出框

】试图关闭故事板呈现的弹出框【英文标题】:Tryingtodismissapopoverthatwaspresentedbystoryboard【发布时间】:2017-08-2216:19:38【问题描述】:我在SO上看到很多关于此的问题,但他们的回答对我没有任何帮助。我正在使用情节提要展示一... 查看详情

iPhone的弹出框控制器[关闭]

】iPhone的弹出框控制器[关闭]【英文标题】:PopovercontrollerforiPhone[closed]【发布时间】:2013-08-1309:51:12【问题描述】:我正在开发iPhone应用程序。我想为我的应用程序创建弹出框控制器。它仅适用于iPad应用程序。请帮忙。【问题... 查看详情

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

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

js简易弹出层

...出的DIV要置于body直属.不必有遮罩DIV.它在运行时由JS生成.关闭时再删掉弹出层DIV和遮罩层使用绝对定位并且长宽一样,在弹出前,将BODY设为无滚动条,以消除网页有滚动条时的盖不住问题弹出层DIV.长宽与页面窗口一样,背 查看详情

UINavigationController 作为 iPhone 上的弹出框?

...oniPhone?【发布时间】:2013-11-0313:07:20【问题描述】:如何使用iOS7中引入的自定义UIViewController过渡呈现带有导航栏的UINavigationController,如iPhone上的弹出框?我使用标准的UIViewController和过渡动画 查看详情

在表格视图中选择项目后无法关闭弹出框

】在表格视图中选择项目后无法关闭弹出框【英文标题】:Can\'tclosepopoverafterselectingitemwithintableview【发布时间】:2012-05-1519:05:39【问题描述】:我正在使用XCode4.3.2版创建iPad应用程序。我无法弄清楚如何关闭在情节提要中创建的... 查看详情

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

...一个视图-并且选择了弹出框样式。当我按下按钮时,新的弹出窗口视图会显示在弹出窗口中,但我有两个问题:当我再次按下按钮时, 查看详情

将弹出框添加到以编程方式添加的 UIBarButtonItem 并将图像添加到相同的弹出框 Swift

...去几天开始,我正在尝试为以编程方式添加的UIBarButtonItem生成一个弹出框, 查看详情

使用 Storyboard Segues 关闭弹出视图

】使用StoryboardSegues关闭弹出视图【英文标题】:DismissingPopoverViewwithStoryboardSegues【发布时间】:2013-09-2801:29:10【问题描述】:我一直在谷歌搜索和搜索堆栈交换中的正确答案,但我似乎找不到它。我所拥有的是通过弹出框segue呈... 查看详情

等效于 SpriteKit 中的弹出框

...iteKit【发布时间】:2020-09-0602:39:28【问题描述】:我正在使用Swift5、SpriteKit、SKTileMap。我想使用等效的弹出框。我使用这个术语是因为我在其他应用程序中经常使用弹出框。基本上,会出现一个小窗口,您阅读一些内容并按OK,... 查看详情

如何通过单击栏按钮关闭弹出框

】如何通过单击栏按钮关闭弹出框【英文标题】:howtodismissthepopoverwiththebarbuttonclick【发布时间】:2013-02-2613:18:03【问题描述】:嘿,我有一个我必须在其中显示弹出框的地方。我可以轻松做到这一点。当显示其他类的弹出窗口... 查看详情

appium问题四的解决办法(模拟器打开的页面弹出框与脚本打开页面的弹出框不一致)

...omatorviewer中定位的。所以:只能在跑脚本的时候,手动去关闭那个弹出框了。(跑脚本的时候每次的弹出框不一样,甚至不出现弹出框。)如果跑脚本的弹出框与用模拟器打开时候的弹出框一致的话,就不会 查看详情

关闭弹出框后如何调用函数?

】关闭弹出框后如何调用函数?【英文标题】:Howtocallafunctionafterclosingapopover?【发布时间】:2020-06-0102:47:01【问题描述】:希望有人能给初学者一些指导,我的问题是这样的:我有一个弹出窗口我用mainViewController的segue打开那个... 查看详情

iOS 5 中的弹出框变化?

】iOS5中的弹出框变化?【英文标题】:PopoverchangesiniOS5?【发布时间】:2011-11-2212:06:06【问题描述】:我刚刚开发了一个iPad应用程序进行测试,但在iOS4.3中完成了。现在我已经在模拟器中更新到5.0,并且还按照Apple的步骤在运行5.... 查看详情

iOS 7:显示搜索栏的弹出框

】iOS7:显示搜索栏的弹出框【英文标题】:iOS7:showingapopoverfromasearchbar【发布时间】:2013-09-2505:07:05【问题描述】:我在iPad应用程序中有一个UISearchBar。当搜索栏开始编辑时,我会在搜索栏下方显示一个弹出框,其中包含搜索建... 查看详情

在用户输入时显示预先输入的弹出框

】在用户输入时显示预先输入的弹出框【英文标题】:Showtypeaheadpopoverwhileuseristyping【发布时间】:2019-09-1722:02:36【问题描述】:我正在尝试执行以下操作:如您所见,在您开始输入时会出现一个弹出框,并在您输入时更新结果... 查看详情