5

別のView Controllerから呼び出したモーダルView Controllerがあります。モーダル ビュー コントローラーを閉じると、そのモーダル ビューを表示したビュー コントローラーでメソッドを呼び出す必要があります。これを行う最も簡単な方法は何ですか?

モーダル ビュー コントローラーでこれを実行してみました:[(ParentViewController*)self.presentingViewController foo];を呼び出す前に[self dismissViewControllerAnimated:YES completion:nil];.

コントローラーで定義およびプロトタイプ化されているにもかかわらず、Xcode で foo が認識されないというエラーが表示されます。あなたのソリューションにブロックが含まれている場合、私はそれらを本当に理解していないので、詳細を追加していただければ幸いです。ありがとう。

ParentViewController.h

@interface ParentViewController : UITableViewController <UITableViewDelegate, UITableViewDataSource>
{
    NewAssignmentViewController *newAssignmentViewController;
    TableViewDataSource *data;
}

-(void)foo;

@end
4

3 に答える 3

11

次のように、提示するコントローラーへの正しい参照を取得する必要があります。

ParentViewController *presenter = [(UITabBarController *)self.presentingViewController viewControllers][0]; // 0 is assuming that ParentViewController is in the first tab. Change if necessary
[presenter foo];

それを行う別の方法は、委任を使用することですが、それは別の機会に答えます。

于 2013-08-12T05:41:00.590 に答える
2

Storyboard セグエを使用して View Controller を表示している場合は、Unwind Segue を使用して閉じることができます。アンワインド セグエは、提示されたビュー コントローラーをプレゼンターに戻す特別な種類のセグエです。

これを実現するには、次のシグネチャを使用して、表示側のビュー コントローラーにメソッドを作成します。

- (IBAction)unwindAction:(UIStoryboardSegue*)unwindSegue;

これはIBAction、パラメーターの型がUIStoryboardSegue*通常のid型ではなく であるため、標準とは異なります (名前を付ける必要はありません。好きなように指定unwindSegue:できますmodalViewFinished:。重要な部分は、戻り値の型IBActionとパラメーターの型があることです)。のUIStoryboardSegue*)。

このメソッドを定義したら、ストーリーボードでモーダル ビュー コントローラー アイコン (ビューの下のアイコンの小さなバー) からコントロール アンド ドラッグし、緑色の出口標識で接続を解放します。これにより、アンワインド セグエが作成されます。これidentifierは、属性インスペクターで指定する必要があります。アンワインド セグエはストーリーボード キャンバスに視覚的に表示されないため、キャンバスの左側にあるアイテムのリストで見つける必要があります (デフォルトでは折りたたまれています。左下の小さな円形のボタンをクリックして展開します)。キャンバスの手の隅)。

を呼び出すのではなく、それを行ったら、代わりに呼び出す[self dismissViewControllerAnimated:YES completion:nil]だけ[self performSegue:<Identifier you gave the unwind segue>]です。このプロセス中unwindAction:に、表示側のビュー コントローラーで定義されたprepareForSegue:メソッドとモーダル ビュー コントローラーのメソッドを呼び出す必要があります。これらのメソッドで実行する必要があるクリーンアップはすべて実行できます (たとえば、fooからメソッドを呼び出します)。unwindSegue:

于 2013-08-12T05:18:18.787 に答える
0

MainView である UIViewController のメソッドを呼び出し、ActionSheet にしたい UIViewController を渡します。

UIActionSheet *actionSheetController =[[UIActionSheet alloc] initWithTitle:nil delegate:self cancelButtonTitle:@"Cancel" destructiveButtonTitle:nil otherButtonTitles:@"show otherview", nil];
 [self presentModalViewController:actionSheetController animated:YES ];

UIActionSheet を閉じるには、dimissWithClickedButtonIndex:animated: を実装できる UIActionSheet のメソッドです。メソッドは誰でも呼び出すことができます(したがって、メインビューからそれを却下したい場合は、アクションシートへの参照を持ち、次のようにします

-(void)actionSheet:(UIActionSheet *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex {
{
        switch (buttonIndex){
            case 0:
            {
               [actionSheet dismissWithClickedButtonIndex:0 animated:YES];
            }
                break;

            case 1:
            {
                MyClass *myclassObject = [[MyClass alloc]init]; 
                [myclassObject foo];
            }
       }
}

このメソッドは、ユーザーが「キャンセル」ボタンをクリックするたびに呼び出されます。

理解を深めるために、このModalViewControllersリンクを使用してください...!

于 2013-08-12T04:54:34.267 に答える