2

モーダルセグエを実行する場合、セグエの実行後に元のViewControllerは破棄されますか?宛先コントローラーのデリゲートをソースViewControllerに設定していますが、宛先ViewController.viewDidLoadの場合、self.delegateはnilです...

次のコードは、ログメッセージ「ListViewController.viewDidLoad:私のデリゲートはnilです:(」を生成します。

[ソース]MapViewController:

- (void) prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender{
    if([segue.identifier isEqualToString:@"mapToList"]){
        NSLog(@"MapViewController.prepareForSegue: Segue mapToList being called, setting LisViewController's delegate to myself");
        [segue.destinationViewController setDelegate:self];
        if(!self){
            NSLog(@"MapViewController.prepareForSegue: I am nil.");
        } else {
            NSLog(@"MapViewController.prepareForSegue: I am NOT nil.");
        }
    }
}

[宛先]ListViewController:

- (void)viewDidLoad
{
    [super viewDidLoad];

    if(!self.delegate){
        NSLog(@"ListViewController.viewDidLoad: My delegate is nil :(");
    } else {
        NSLog(@"ListViewController.viewDidLoad: My delegate populated");
    }
}
4

3 に答える 3

3

あなたのコードは正しいようです。私が別の方法で行った唯一のことは、ナビゲーションコントローラーにネストされたテーブルビューコントローラーであるスケルトンフレームワークでこれをテストすることです。次のコードでテストしたところ、問題なく動作します。

ルート ビュー コントローラー .h:

@interface RootTableViewController : UITableViewController <newTest>

Segue の準備 (rootViewController 内):

-(void) prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender{

 if ([segue.identifier isEqualToString:@"segueToModalView"]){
       [segue.destinationViewController setDelegate:self];  
 }
}

モーダル ビュー コントローラー .h の上部:

@protocol newTest <NSObject>
  -(void) hello;
@end

モーダル ビューでのプロパティ宣言:

@property (nonatomic, strong) id <newTest> delegate;

モーダル ビューでの ViewDidLoad:

- (void)viewDidLoad
{
   [super viewDidLoad];
   NSLog(@"%@", self.delegate);
}

私の NSLog の self.delegate は適切に出力され、コードは多かれ少なかれあなたのものと同じように見えます。あなたの財産は正しく宣言されていますか?

于 2012-04-10T20:21:53.970 に答える
1

セグエが a に対するものである場合、NavigationControllerdestinationViewControllerデリゲートを失います。

モーダル セグエを に追加しdestinationViewController、 と を追加NavigationBarしてナビゲーション コントローラーをシミュレートすることで、この問題を回避しました ( 「完了」ボタンと「キャンセル」ボタンの を でラップしたBar Buttonsと仮定します)。destinationViewControllerNavigationController

でデリゲートを通常どおりに設定しますrootViewController

-(void) prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender{

   if ([segue.identifier isEqualToString:@"segueToModalView"]){
     [segue.destinationViewController setDelegate:self];  
   }
}

それが役立つことを願っています

于 2013-02-10T17:34:49.943 に答える