背景
我有一个自定义的UIViewController类,我用自定义注释填充MKMapView。当用户选择注释时,将显示有关该注释的详细信息,并且还存在一个按钮,供用户选择并启动另一个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
按下按钮时创建视图控制器,然后立即执行segue到第二个视图控制器:
- (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我能够确认在创建类时正确传递了该值。但是,当我稍后在代码(viewWillAppear)中使用属性userID
时,我不再使用它了。我假设有一个内存问题,我没有照顾,但我似乎无法弄明白。我如何确保在创建时传递给类的值/对象保持不变?
Side注意:我最初尝试过,传递一个PinData
对象,但遇到了同样的问题,所以我知道这不是NSInteger的问题。我也遵循了诺亚的建议并使用了prepareForSegue
但是,我得到了同样的问题
答案 0 :(得分:3)
segue负责实例化控制器。不要实例化另一个 - 它只是被丢弃,这就是为什么属性值似乎不坚持。
要设置视图控制器,请在父视图控制器中覆盖-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];