从 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
从内部对其进行了测试。
你确定你是从主线程调用这个的吗?
我必须做一些不寻常的事情才能从主线程调用它吗?我使用didSelectRowAtIndexPath
从AnotherViewController
调用它。没有 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 不起作用