2015-05-05 3 views
1

Я пытаюсь передать объект (PFObject) от контроллера представления к другому,передачи данных между контроллером зрения

-(void)mapView:(MKMapView *)mapView annotationView:(MKAnnotationView *)view calloutAccessoryControlTapped:(UIControl *)control 
{ 
    RestauCardViewController *restauCard = [[RestauCardViewController alloc]init]; 
    RestaurantAnnotation *restoAnnotation = (RestaurantAnnotation *)view.annotation; 

    restauCard.restaurant = restoAnnotation.restaurant; 
    [self performSegueWithIdentifier:@"segueToCard" sender:nil]; 
} 

При попытке отобразить объект в другом контроллере представления я получил нулевой:

#import <UIKit/UIKit.h> 
#import <Parse/Parse.h> 

@interface RestauCardViewController : UIViewController 

@property(nonatomic) PFObject *restaurant; 

@end 

Это моя viewDidLoad функция

- (void)viewDidLoad { 
    [super viewDidLoad]; 
    // Do any additional setup after loading the view. 

    NSLog(@"The restaurant name is : %@",_restaurant[@"nom"]); 
} 
+0

См. Http://stackoverflow.com/questions/14805954/mkannotationview-push-to-view-controller-when-detaildesclosure-button-is-clicked. Вместо того, чтобы использовать свойство или ivar для хранения выделения, передайте аннотацию 'view' как' sender'. Это делает код более самодостаточным и использует функции, уже предоставленные api. – Anna

ответ

2

Вы должны использовать -prepareForSegue, чтобы справиться с этой ситуацией, и вы будете нуждаться в Ивар, чтобы сохранить название ресторана.

Таким образом, в верхней части .m файл вашей собственной карты, добавьте Ивар NSString

@implementation yourViewController{ 

    NSString *sRestName; //This is empty until the user selects a restaurant 

} 

-(void)mapView:(MKMapView *)mapView annotationView:(MKAnnotationView *)view calloutAccessoryControlTapped:(UIControl *)control 
{ 
    sRestName = //Set the name of your restaurent here, it's just a string. 
       //You could set any other type of object (a restaurent object or a PFOjbect or anything, 
       //just change the ivar accordingly 
    [self performSegueWithIdentifier:@"segueToCard" sender:nil]; 
} 

Что вы собираетесь сделать, это заменить старый код с кодом чуть выше, вам просто нужно выполнить перейдите к следующему методу.

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { 

    if([segue.identifier isEqualToString:@"fromHomeToList"]){ 
     RestauCardViewController *vc = (RestauCardViewController*)segue.destinationViewController; 
     vc.restaurant = sRestName; //here you're just giving the property of the new controller the content of your ivar. 
} 

Таким образом, вы можете передать объект с вашего крана на свой контроллер. Вы также уверены, что он никогда не будет никчем, потому что пользователь постучал по нему; если бы это было нуль, ну, он не мог бы постучать его в первую очередь!

Обратите внимание, что я предположил, что вы использовали строку для имени вашего ресторана, но если вы измените Ивар на вершине, вы можете использовать все, что вы хотите, до тех пор, как вы можете извлечь его из нажав на карте. Если вы не можете, мне нужно больше деталей, чтобы провести вас через другое решение.

Спросите меня, есть ли у вас какие-либо quesiton, иначе это должно сработать!

+0

Спасибо, что много работает :) –

+0

Вы можете отметить ответ правильно: D Рад, что я мог помочь! –

2

Вы должны установить Restaurent внутри метамфетамин UIViewController od "prepareSegue...". Он вызывается после вас performeSegueWithIdentifier, поэтому контроллер назначения доступен, и вы можете протестировать segue.identifier и установить Restaurent на контроллер.

Пример:

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { 

    if ([segue.identifier isEqualToString:@"segueRestaurentDetails"]) { 

     RestauCardViewController *destController = (RestaurentDetailsViewController *)segue.destinationViewController; 
     destController.restaurant = (RestaurantAnnotation *)view.annotation; 
} 
+0

Спасибо, но как я могу получить доступ к представлению из метода prepareForSegue? –

+0

Вы можете сохранить его, прежде чем вызывать «performeSegueWithIdentifier» внутри частной переменной, например '@property (неатомный, сильный) UIView * viewToDisplay;'. Затем вы получите его как '(RestaurantAnnotation *) _ viewToDisplay.nnnation;' –

+0

Не используйте свойство для этого, оно доступно извне класса, который вам не нужен. Вместо этого используйте ivar; см. мой ответ для более подробной информации. Оба наших ответа довольно близки друг к другу. –

0

Реализовать prepareForSegue:sender: метод в ViewController

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { 
    if([segue.identifier isEqualToString:@"segueToCard"]) { 
     RestauCardViewController *controller = (RestauCardViewController *)segue.destinationViewController; 
     controller.restaurant = (RestaurantAnnotation *)view.annotation; 
    } 
} 
+0

спасибо, но я получаю эту ошибку: controller.restaurant = (RestaurantAnnotation *).аннотаций; Использование незаявленного идентификатора вида –

+0

как вы объявляете 'view' в своем коде? –

+0

здесь: - (void) mapView: (MKMapView *) mapView annotationView: (MKAnnotationView *) viewoutoutAccessoryControlTapped: (UIControl *) управление { [self performSegueWithIdentifier: @ "segueToCard" отправитель: ноль]; } –

Смежные вопросы