从 AppDelegate 外部调用放置在 AppDelegate 中的 UIActionSheet

Posted

技术标签:

【中文标题】从 AppDelegate 外部调用放置在 AppDelegate 中的 UIActionSheet【英文标题】:Calling UIActionSheet that is placed in AppDelegate from outside AppDelegate 【发布时间】:2012-03-01 16:23:30 【问题描述】:

我的 AppDelegate 中有一个 UIActionSheet,由以下人员调用:

- (void)showActionSheet 
    UIActionSheet *sheet = [[UIActionSheet alloc] initWithTitle:nil delegate:self cancelButtonTitle:@"Cancel" destructiveButtonTitle:@"Call Lilly" otherButtonTitles:@"Email IMCLONE Trials", @"Email EmergingMed", nil];
    [sheet showFromTabBar:self.tabBarController.tabBar];

我需要从AnotherViewController 打电话给它。在控制器中我有:

[(LYAppDelegate *)[[UIApplication sharedApplication] delegate] showActionSheet];

...这不起作用。我得到了错误:

[3990:207] *** Assertion failure in -[UIActionSheet _presentSheetFromView:above:], /SourceCache/UIKit_Sim/UIKit-1912.3/UIActionSheet.m:1747

我假设问题是对self.tabBarController.tabBar 的引用在AnotherViewController 的范围内无效,但应该是,对吧?毕竟,我可以毫无问题地在AnotherViewController 中执行self.tabBarController.selectedSegmentIndex = N 之类的操作。

我什至尝试将showActionSheet: 更改为最后一行是[sheet showFromView:self.window]。当然我的_window 应该可以全球访问?

我显然在这里遗漏了一些基本的东西,但我不确定它是什么。

【问题讨论】:

【参考方案1】:

您是否确保您的 AppDelegate 符合 UIActionSheetDelegate 协议?

【讨论】:

是的,我已经通过在 LYAppDelegate 中调用 showActionSheet 从内部对其进行了测试。 你确定你是从主线程调用这个的吗? 我必须做一些不寻常的事情才能从主线程调用它吗?我使用didSelectRowAtIndexPathAnotherViewController 调用它。没有 Web 服务调用,没有异步发生。我应该做些什么来确保从主线程调用它? 为了确定,我在AnotherViewController 中创建了一个名为-(void)callActionSheet 的方法,代码为[(LYAppDelegate *)[[UIApplication sharedApplication] delegate] showActionSheet];,然后我将didSelectRowAtIndexPath 更改为[self performSelectorOnMainThread:@selector(calLActionSheet:) withObject:nil waitUntilDone:NO]; 嗯。 didSelectRowAtIndexPath 发生在主线程上。您是否尝试过检查是否可以看到类似以下内容的 tabBar:NSLog(@"Window: %@; tabbar: %@",[appDelegate.window description], [appDelegate.tabBarController.tabBar description]);

以上是关于从 AppDelegate 外部调用放置在 AppDelegate 中的 UIActionSheet的主要内容,如果未能解决你的问题,请参考以下文章

从 App Delegate 调用 ViewController 的方法

从 App Delegate 调用时,PushViewController 不起作用

在另一个类的 App Delegate 调用方法中

如何从 Vue APP 外部调用/初始化 Vue 方法

iOS:调用 AppDelegate 的打开 url 时不显示 Touch Id

如何从 AppDelegate 调用在 ViewController 中声明的方法