2017-02-10 5 views
1

Я пытаюсь передать титул аннотацию на второй контроллер представления с calloutAccessoryControlTapped способом, как это:Передача строки на второй вид контроллера UILabel при выполнении SEGUE

- (void)mapView:(MKMapView *)mapView annotationView:(MKAnnotationView *)view 
calloutAccessoryControlTapped:(UIControl *)control 
{ 
    //My second VC's UILabel outlet 
    self.lblAnnotationTitle.text = view.annotation.title; 
    [self performSegueWithIdentifier:@"gymDetails" sender:self]; 

} 

Когда контроллер представления показывает вверх, label еще не обновлен. Почему это так?

Кроме того, это правильный способ передать свойства другому контроллеру представления? Если нет, то лучший способ сделать это?

+0

вам нужно для создания строковой переменной для получения данных и прохождения. – vaibhav

ответ

1

Вы должны осуществлять prepareForSegue и передать значение там

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { 
    if ([segue.identifier isEqualToString:@"gymDetails"]) { 
     GymDetailViewController *destViewController = segue.destinationViewController; 
     destViewController.ivar = @"Your Text here"; 
    } 
} 

Тогда в ваш взгляд сделал груз вы должны сделать, как

lblAnnotationTitle.text = ivar; 
+0

Пока не отображается текст, когда отображается контроллер вида. – iamhx

+0

Означает ли это, что мне нужно будет создать новый класс UIViewController и определить его в моей раскадровке? – iamhx

+0

@iamhx без класса, как вы будете обновлять UILabel вашего второго контроллера. Вам необходимо создать класс UIViewController для вашего второго контроллера. –

1

Лучший способ сделать это - сделать внутри метод -prepareForSegue.
Внутри этого метода, просмотрев идентификатор, вы можете захватить destinationViewController и обновить модель.
Обратите внимание те аспекты:

  1. , если ваш контроллер представления содержится внутри контроллера вид контейнера контроллер вид назначения является контроллером вид контейнера, так что вам нужно, чтобы извлечь ваш контроллер представления из него
  2. До Segue это значит, что соединения между розеткой все еще находятся на нуле, поэтому, если вы принудительно обновляете ярлык с текстом, ничего не произойдет. Один из способов сделать - передать текст как «модель» и обновить метку внутри метода -viewDidLoad контроллера точки назначения.
+0

Разве раскадровка считается контроллером контейнера? Потому что мой второй VC также находится в той же раскадровке, что и мой первый VC. – iamhx

+0

Раскадровка - это просто представление вашего потока и пользовательского интерфейса, это своего рода XML-файл, поэтому нет, они не являются контроллером контейнера. Например, если вы представляете модально свой контроллер представления и в нем находится контроллер навигации, контроллер навигации является контейнером, возвращаемым с контроллера представления назначения. – Andrea

+0

Я вижу ... Да, у меня есть контроллер навигации. Как я могу указать его на контроллер просмотра, если это так? – iamhx

0

Попробуйте это:

override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 
    if segue.identifier == "xxx" { 
     if let destination = segue.destination as? XXX { 
      destination.xx = xx 
     } 
    } 
} 
+0

Извините, возможно ли это изменить в Obj-C? Я еще не научился быстро ... – iamhx

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