0

UIViewController のサブクラスがあります - > MyPopUpViewController

@protocol MyPopUpViewController Delegate;
@interface MyPopUpViewController : UIViewController
{

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

-(IBAction) buttonPressed:(id)sender;
@end

@protocol MyPopUpViewControllerDelegate
-(void) popupButtonPressed: (MyPopUpViewController*)controller;
@end

この MyPopUpViewController をインスタンス変数として持つことはできません。これは外部から取得されるためであり、これらのポップアップが多数存在する可能性があります。これまでのところ、これを試してみましたが、保持されていないためにデリゲート呼び出しでクラッシュします:

MyMainViewController:

-(void)externalNotificationReceived: (NSString*) sentMessage
{    
    MyPopUpViewController *popupView = [[MyPopUpViewController alloc] init];
    popupView.delegate = self;

    [self.view addSubview:popupView.view];

    [popupView setInfo :sentMessage :@"View" :@"Okay"];
    popupView.view.frame = CGRectMake(0, -568, 320, 568);
    popupView.view.center = self.view.center;
}

-(void)popupButtonPressed:(MyPopUpViewController *)controller :(int)sentButtonNumber
{
    NSLog(@"Popup Delegate Called");

    [controller.view removeFromSuperview];
    controller.delegate = nil;
    controller = nil;
}

ポップアップが表示され、[OK] ボタンがタップされると、クラッシュし、その NSLog に到達しません。どうすれば変更できますか

MyPopUpViewController *popupView = [[MyPopUpViewController alloc] init];

..インスタンス変数にせずに保持しますか?

前もって感謝します。

4

2 に答える 2

1

通常、デリゲートは強い参照ではなく弱い参照です。私自身、他の人を混乱させないように別の名前を付けます。

また、次のコードは効果がありません。

-(void)popupButtonPressed:(MyPopUpViewController *)controller :(int)sentButtonNumber
{
    ...
    controller = nil;
}

コントローラーはnil、スコープの最後で自動的に解放されます ( に設定されます)。

于 2013-12-16T19:30:11.967 に答える