0

UpdateViewController には、モーダル ビュー (UpdateViewController) を閉じるデリゲート MyDownloadController によって呼び出される関数があります。

-(void)errorDownloading {
    self.downloadController.delegate = nil;
    [downloadController release];

    [self dismissModalViewControllerAnimated:YES];
} 

デリゲートポインターをいじったり、いじったりせずにこれを試してみましたが、それでもビューを閉じません。

デリゲートは、MyDownloadController 内で次のようにメソッドを呼び出します。

-(void)connectionError {
    if([delegate respondsToSelector:@selector(errorDownloading)]){
        [delegate errorDownloading];
    }
}

そして、この関数は別のデリゲート (MyConnectionController) によって呼び出されます。

これだけ多くの代表者がいることは何か問題がありますか? そして、ポインターエラーまたはそれらに伴う何かは、モーダルビューを閉じることができることに影響しますか? もしそうなら、どのように/なぜですか?

私は委任のためにこの構造を持っています:

UpdateViewController (the actual modal view I am trying to close)
|- MyDownloadController (the controller that abstracts the process being done)
    |- MyConnectionController (a helper class I wrote to interact with NSURLConnection)
        |- NSURLConnection

この問題を診断する最善の方法は何ですか?

4

2 に答える 2

2

downloadController が却下したいビューである場合、リリースが早すぎると思います。

-(void)errorDownloading {
    [self dismissModalViewControllerAnimated:YES];

    self.downloadController.delegate = nil;
    [downloadController release];
} 
于 2010-07-25T01:32:04.043 に答える
0

Appleのドキュメントによると:

dismissModalViewControllerAnimated:

受信者によって提示されたモーダルビューコントローラを閉じます。

つまり、却下するModalViewControllerを提示したviewControllerでdismissModalViewControllerAnimated:メソッドを呼び出します。あなたの場合、これは使用する正しいコードです。

-(void)errorDownloading {
    self.downloadController.delegate = nil;
    [downloadController release];

    [self.parentViewController dismissModalViewControllerAnimated:YES];
}

また、デリゲートとポインターの数に関する他の質問にも答えてください。デザインが優れているということは、通常、デリゲートオブジェクトの巨大な文字列がないことを意味しますが、それが間違っていると言う理由はほとんどありません。あなたが説明したようなポインタは、リークやクラッシュを引き起こす可能性が最も高いです。それが閉じない理由は、私が上で指定したものであり、適切なレシーバーにメソッドを呼び出していませんでした。

于 2010-07-25T19:05:40.530 に答える