OK、ここで私はここ数時間把握しようとしてきた奇妙な問題を抱えています:
FirstViewController
メインのView ControllerとModalViewController
モーダルセグエに表示される2つのView Controllerを備えたiPad用のシンプルなストーリーボードアプリがあり、Doneというボタンがあります。私はARCを使用しており、View ControllerはiPad用に指定されています。
UIModalViewControllerDelegate
ご想像のとおり、モーダルを閉じてデータを最初のView Controllerに戻すカスタムデリゲートもあります。
UIModalViewControllerDelegate.h
@protocol UIModalViewControllerDelegate <NSObject>
@required
-(void)btnDonePressed:(id)sender Values:(NSArray *)values;
@end
FirstViewController.h
@interface FirstViewController : UIViewController <UIModalViewControllerDelegate> {
@private
ModalViewController *mvc;
}
@end
FirstViewController.m
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
if (self) {
// Custom initialization
}
return self;
}
- (void)viewDidLoad
{
[super viewDidLoad];
// Do any additional setup after loading the view.
}
-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
mvc = [segue destinationViewController];
mvc.delegate = self;
}
- (void)didReceiveMemoryWarning
{
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
#pragma UIModalViewControllerDelegate
-(void)btnDonePressed:(id)sender Values:(NSArray *)values {
...
}
ModalViewController.h
@interface ModalViewController : UIViewController {
__weak id<UIModalViewControllerDelegate> delegate;
}
@property (weak, nonatomic) id<UIModalViewControllerDelegate> delegate;
ModalViewController.m
@implementation ModalViewController
@synthesize delegate;
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
if (self) {
// Custom initialization
}
return self;
}
- (void)viewDidLoad
{
[super viewDidLoad];
// Do any additional setup after loading the view.
self.navigationItem.rightBarButtonItem = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemDone target:self action:@selector(buttonPressed:)];
}
-(void) buttonPressed:(id) sender {
[delegate btnDonePressed:sender Values:values];
}
さて、非常に興味深い問題がいくつかあります:
1-セグエの準備でself.mvc.delegate = self;
、デバッガーを設定した後、デリゲートがまだnilであることを示しています(!)ただし、使用するNSLog(@"%@", self.mvc.delegate);
と、nilではないポインターのアドレスが取得されます。
ModalViewController
2-デリゲートでは常にnilであるため、上記のコードは機能しません。したがって、[delegate btnDonePressed:sender Values:values];
決して実行されません。この問題を引き起こす可能性があるとわかっていることはすべて試しましたが、何もうまくいかないようです。
3-デリゲートに強い参照を持つことでこの問題を解決できると思いますが、パターンに違反して保持サイクルの問題を引き起こしたくありません。プライベート変数ModalViewController *mvc;
のFirstViewController
ライフサイクルに問題はありますか? プライベート変数はいつ nil になりますか? ところで、私もそれを置き換えようとしました@property (strong, nonatomic) ModalViewController *mvc;
が、何も変わりませんでした。