我正在开发一个在 detailViewController 中显示一些数据的应用程序。我在导航栏中有一个 rightBarButton,它显示了一个 UIActivityViewController,其中填充了我自己的 UIActivity 子类项目。它们中的大多数都可以正常工作,因为它们只是从详细视图中更改数据的一个小方面,但是我需要其中一个在选择时打开 modalViewController。我不断从控制台收到以下警告.....
Warning: Attempt to present <UINavigationController: 0x1fd00590>
on <UITabBarController: 0x1fde1070> which is already presenting <MPActivityViewController: 0x1fd2f970>
我想值得注意的是应用程序不会崩溃,但模式视图也不会出现。我假设 UIActivityViewController 本身就是一个模态视图,您一次只能显示其中一个,因此任务是弄清楚在 ActivityView 消失后如何执行我的 segue,但这就是我难住的地方。我欢迎任何帮助、想法或反馈。我试过谷歌,但运气不佳,我猜是因为 UIActivityViewController 太新了。
到目前为止,这是我的设置,我的 UIActivity 对象有一个委托设置为 detailViewController 用于自定义协议,该协议允许 detailViewController 执行数据更改,然后更新其视图。
对于应该呈现 modalView 控制器的有问题的活动,我尝试了几种方法,它们都得到相同的警告。
这些都不起作用!!!
1)只是尝试从我的委托方法执行segue
- (void) activityDidRequestTransactionEdit
{
NSLog(@"activityDidRequestTransactionEdit");
[self performSegueWithIdentifier:@"editTransaction" sender:self];
}
2)尝试在 UIActivityViewController 上设置一个完成块,并让我的委托方法设置一个 bool 标志,应该显示模态视图(self.editor)
[activityViewController setCompletionHandler:^(NSString *activityType, BOOL completed) {
NSLog(@"completed dialog - activity: %@ - finished flag: %d", activityType, completed);
if (completed && self.editor) {
[self performSegueWithIdentifier:@"editTransaction" sender:self];
}
}];
3)子类化 UIActivityViewController 本身,将 detailView 作为委托,并用我自己的完成块覆盖它的 dismissViewControllerAnimated: 方法
- (void) dismissViewControllerAnimated:(BOOL)flag completion:(void (^)(void))completion
{
[super dismissViewControllerAnimated:flag completion:^{
[self.MPActivityDelegate activityDidRequestTransactionEdit];
}];
}
工作解决方案
在 UIActivity 子类中,您需要像这样覆盖此方法
- (UIViewController *) activityViewController {
MPEditMyDataViewController *controller = [[MPEditMyDataViewController alloc] init];
controller.activity = self; // more on this property below
UINavigationController *navController = [[UINavigationController alloc] initWithRootViewController:controller];
return navController;
}
在你的 MPEditMyDataViewController.h (选择的动作应该产生的视图控制器)你需要一个属性回到活动子类,像这样
@property (strong, nonatomic) MPEditMyDataActivity *activity;
在你的 MPEditMyDataViewController.m
- (void)viewDidLoad
{
[super viewDidLoad];
UIBarButtonItem *cancelButton = [[UIBarButtonItem alloc]
initWithBarButtonSystemItem:UIBarButtonSystemItemCancel
target:self
action:@selector(cancel)];
self.navigationItem.leftBarButtonItem = cancelButton;
}
// here's how you dismiss the view controller when you are done with it
// after saving the changes to your data or whatever the view controller is supposed to do.
-(void) cancel
{
NSLog(@"Cancel Button Pushed");
[self.activity activityDidFinish:YES];
}
@end