如何从 UIActivity 视图控制器中选择的 UIActivity 项目中呈现 ModalViewController?

Posted

技术标签:

【中文标题】如何从 UIActivity 视图控制器中选择的 UIActivity 项目中呈现 ModalViewController?【英文标题】:How can I present a ModalViewController from a UIActivity item picked from UIActivity View Controller? 【发布时间】:2013-03-12 19:03:07 【问题描述】:

我正在开发一个在 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

【问题讨论】:

【参考方案1】:

做了一些更多的文档挖掘并找到了 UIActivity 子类化的这个方法

- (UIViewController *) activityViewController

它让我的视图控制器像我想要的那样弹出,方法是从这里返回它,而不是试图从我的 detailViewController 中分离它。现在要弄清楚当我完成它时如何关闭它!!!!

【讨论】:

只是为了跟进以防其他人遇到问题,请参阅上面编辑中的解决方案示例。

以上是关于如何从 UIActivity 视图控制器中选择的 UIActivity 项目中呈现 ModalViewController?的主要内容,如果未能解决你的问题,请参考以下文章

UIActivity activityViewController 在 iPad 上以模态方式呈现,而不是在弹出窗口中

如何从 UIActivity 控制器中删除“添加到 iCloud Drive”?

如何在集合视图的底部/页脚中添加 uiactivity 指示器?

UIActivity 视图控制器:自定义 Activity 放置

自定义 UIActivity ViewController 背景图像透明度不起作用

覆盖 UIActivityViewController 默认行为