2

バックグラウンド:

MKMapView にカスタム注釈を設定するカスタム UIViewController クラスがあります。ユーザーが注釈を選択すると、その注釈に関する詳細が表示され、ユーザーがマップ上のそのポイントに関する詳細を含む別の UIViewController を選択して表示するためのボタンも表示されます。

コード:

UserID を使用してクラスを作成することにより、新しいビュー コントローラーを初期化します (注: - (id) initWithUserID:(NSInteger) userID;SecondViewController のヘッダー ファイルで宣言されています。

@interface SecondViewController ()

@property (nonatomic) NSInteger userID;

@end



@implementation RainFallDetailedViewController

@synthesize userID = _userID;


- (id) initWithUserID:(NSInteger) userID{

_userID = userID;
NSLOG(@"UserID: %i",self.userID); //correctly displays user id

return self;
}

- (void) viewWillAppear{
NSLOG(@"UserID: %i",self.userID); //userid is now 0

ビュー コントローラの作成は、ボタンが押されると完了し、すぐに 2 番目のビュー コントローラへのセグエを実行します。

- (void)mapView:(MKMapView *)mapView 
annotationView:(MKAnnotationView *)view calloutAccessoryControlTapped:(UIControl *)control {

if ([(UIButton*)control buttonType] == UIButtonTypeInfoLight){ //I'm looking for recognition of the correct button being pressed here.
    //SecondViewController is the second view controller with the detailed information about the map point.  
    //DataPoint is a custom class that contains the details regarding the map point.
    SecondViewController *detailedMapController = [[SecondViewController alloc] initWithUserID:((DataPoint *)view.annotation).userID]; 

    NSLOG(@"UserID: %i", ((DataPoint *)view.annotation).userID); //correctly displays userID

    [self performSegueWithIdentifier:@"PinDetail" sender:detailedMapController];


} 
}

問題:

NSLOG を使用して、クラスの作成時に値が正しく渡されていることを確認できます。ただし、userID後でコード (viewWillAppear) でこのプロパティを使用するときは、もはや使用できません。私が対処していないメモリの問題があると思いますが、それを理解できないようです。作成時にクラスに渡す値/オブジェクトがそこにとどまるようにするにはどうすればよいですか?

補足: 最初にPinDataオブジェクトを渡そうとしましたが、同じ問題に遭遇したため、NSInteger の問題ではないことはわかっています。私もnoaの提案に従って使用しprepareForSegueましたが、上記と同じ問題が発生します

4

1 に答える 1

3

セグエは、コントローラーのインスタンス化を担当します。別のものをインスタンス化しないでください。破棄されるだけです。これが、プロパティ値が固執していないように見える理由です。

ビュー コントローラーを設定する-prepareForSegue:には、親ビュー コントローラーで代わりにオーバーライドします。

- (void) prepareForSegue:(UIStoryboardSegue *) segue sender:(id) sender {
    if ([segue.identifier isEqualToString:@"PinDetail"]) {
        SecondViewController *vc = segue.destinationViewController;
        vc.userID = self.userID;
    }
}

上記のコードの最後のブロックを次のように置き換えます。

self.userID = ((RainFallDataPoint *)view.annotation).userID;
[self performSegueWithIdentifier:@"PinDetail" sender:self];
于 2012-04-26T17:04:52.713 に答える