6

私はdetailViewControllerにいくつかのデータを表示するアプリに取り組んでいます。ナビゲーションバーにrightBarButtonがあり、独自のUIActivityサブクラス化されたアイテムで満たされたUIActivityViewControllerを表示します。それらのほとんどは、詳細ビューからのデータに小さな側面を変更しているだけなので正常に機能しますが、選択したときにmodalViewControllerを開くにはそのうちの1つが必要です。コンソールから次の警告が表示され続けます.....

    Warning: Attempt to present <UINavigationController: 0x1fd00590>  
on <UITabBarController: 0x1fde1070> which is already presenting <MPActivityViewController: 0x1fd2f970>

アプリはクラッシュしませんが、モーダルビューも表示されないことに注意してください。UIActivityViewControllerはそれ自体がモーダルビューであり、一度に表示できるのはそのうちの1つだけであると想定しているため、ActivityViewが消えた後にセグエを実行する方法を理解することがタスクですが、それは私が困惑しているところです。ヘルプ、考え、フィードバックを歓迎します。私はグーグルを試しましたが、あまり運がありませんでした。UIActivityViewControllerがとても新しいからだと思います。

これまでの設定は次のとおりです。UIActivityオブジェクトには、detailViewControllerがデータの変更を実行してから、そのビューを更新できるようにするカスタムプロトコルのdetailViewControllerに設定されたデリゲートがあります。

modalViewコントローラーを表示する必要がある問題のアクティビティについて、すべて同じ警告が表示されるいくつかのアプローチを試しました。


これらの作品はありません!!!


1)デリゲートメソッドからセグエを実行してみました

- (void) activityDidRequestTransactionEdit
{
    NSLog(@"activityDidRequestTransactionEdit");
    [self performSegueWithIdentifier:@"editTransaction" sender:self];
}

2)UIActivityViewControllerに完了ブロックを設定し、デリゲートメソッドにモーダルビューを表示するブールフラグを設定させてみました(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
4

1 に答える 1

3

さらにドキュメントを掘り下げて、UIActivityサブクラス化のためのこのメソッドを見つけました

- (UIViewController *) activityViewController

detailViewControllerからセグエするのではなく、ここから返すことで、ViewControllerが希望どおりにポップアップ表示されます。今、私がそれを終えたときにそれを却下する方法を理解するために!!!!

于 2013-03-12T20:59:02.027 に答える