Вопрос по objective-c, ios5 – Настройка контроллера подробного представления с помощью segue

2

BACKGROUND:

У меня есть пользовательский класс UIViewController, где я заполняю MKMapView пользовательскими аннотациями. Когда пользователь выбирает аннотацию, отображаются подробные сведения об этой аннотации, а также имеется кнопка, позволяющая пользователю выбрать и вызвать другой UIViewController с подробной информацией об этой точке на карте.

The Code:

Я инициализирую новый контроллер представления, создавая класс с UserID (Примечание:- (id) initWithUserID:(NSInteger) userID; объявлен в заголовочном файле SecondViewController:

<code>@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
</code>

Создание контроллера вида выполняется при нажатии кнопки, а затем сразу же выполняется переход ко второму контроллеру вида:

<code>- (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];


} 
}
</code>

PROBLEM:

Используя NSLOG, я могу подтвердить, что значение передается правильно при создании класса. Тем не менее, когда я иду использовать свойствоuserID позже в коде (viewWillAppear) он больше не используется. Я предполагаю, что существует проблема с памятью, о которой я не позабочусь, но, похоже, я не могу ее решить. Как я могу гарантировать, что значения / объект, которые я передаю в класс при создании, остаются там?

Side Note: I originally tried, passing a PinData object, but ran into the same issue, so I know it's not a NSInteger problem. I've also followed noa's suggestion and used prepareForSegue however, I get the same problem presented above

Ваш Ответ

1   ответ
3

Segue отвечает за создание экземпляра контроллера. Не создавайте другой экземпляр & # x2013; его просто отбрасывают, поэтому значения свойств, по-видимому, не сохраняются.

Чтобы настроить контроллер вида, переопределите-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];
да я использую раскадровку James Mertz
Похоже, вы должны сделать это путем переопределенияprepareForSegue:.
Я только что проверил. Передача себя как отправителя вызывает у меня ту же проблему. James Mertz
но как мне тогда связать правильный userID с новым viewController. Кроме того, разве это не создаст другой контроллер представления как оригинал? James Mertz
Хорошо, хорошо, контроллер представления, который вы создаете, почти наверняка не тот, который отображается, поэтому, скорее всего, значение свойства не придерживается. Не создавать экземпляр другого контроллера представления для передачи в качестве отправителя, просто передатьself или жеmapView вместо.

Похожие вопросы