执行segue

时间:2017-02-10 08:34:38

标签: ios objective-c uilabel viewcontroller

我尝试使用calloutAccessoryControlTapped方法将注释标题传递给第二个视图控制器,如下所示:

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

}

当视图控制器出现时,标签尚未更新。为什么会这样?

此外,这是将属性传递给另一个视图控制器的正确方法吗?如果没有,有什么更好的方法呢?

3 个答案:

答案 0 :(得分:1)

更好的方法是在-prepareForSegue方法内部进行 在该方法中,通过查看标识符,您可以获取destinationViewController并使用您的模型进行更新 注意那些方面:

  1. 如果您的视图控制器包含在容器视图控制器中,则目标视图控制器是容器视图控制器,因此您需要从中提取视图控制器
  2. 在segue完成之前,您的视图控制器视图未加载,这意味着插座之间的连接仍为零,因此如果您强制使用文本更新标签,则不会发生任何事情。一种方法是将文本作为"模型"并更新目标视图控制器的-viewDidLoad方法内的标签。

答案 1 :(得分: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;

答案 2 :(得分:0)

试试这个:

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