バックグラウンド:
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
ましたが、上記と同じ問題が発生します