【问题标题】:Passing a string to second view controller's UILabel when performing segue执行 segue 时将字符串传递给第二个视图控制器的 UILabel
【发布时间】:2017-02-10 08:34:37
【问题描述】:

我正在尝试使用 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];

}

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

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

【问题讨论】:

  • 你需要创建一个字符串变量来获取数据并通过。

标签: ios objective-c uilabel viewcontroller


【解决方案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;

【讨论】:

  • 这是否意味着我必须创建一个新的 UIViewController 类并在我的故事板中定义它?
  • @iamhx 没有类你将如何更新你的第二个视图控制器的 UILabel。你需要为你的第二个控制器创建一个 UIViewController 类。
  • 你在你的第一个视图控制器中写了self.lblAnnotationTitle.text = view.annotation.title;,你说lblAnnotationTitle是第二个视图控制器的IBOutlet。无法从不同的视图控制器的self 分配IBOutlet 的内容。您需要创建第二个视图控制器的对象,然后才能更新IBOutlet 的内容。 @InderKumarRathore 向您展示了实现目标的完美方式。 :)
  • @AntonyRapel 是的。我已经开始为我的第二个视图控制器创建一个类。我在我的 firstVC.m 文件中导入了 secondVC.h 并将我的文本放入 ivar。但在 viewDidLoad 我的文本是一个空值。
  • 很高兴你找到它!
【解决方案2】:

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

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

【讨论】:

  • 故事板是否被视为容器视图控制器?因为我的第二个 VC 和我的第一个 VC 在同一个故事板中。
  • Storyboard 只是您的流程和 UI 的表示,它是一种 XML 文件,所以不,它们不是容器视图控制器。例如,如果您以模态方式呈现您的视图控制器并且它包含一个导航控制器,则导航控制器是从目标视图控制器返回的容器。
  • 我明白了...是的,我确实有一个导航控制器。如果是这种情况,我如何将其指向视图控制器?
  • 检查文档中的导航控制器属性,有一堆你所有的 VC 推送,如果我没记错的话,还有一个 topViewController 属性
【解决方案3】:

试试这个:

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

【讨论】:

  • 抱歉,可以在 Obj-C 中更改吗?我还没学过swift..
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-02-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-08
  • 2011-08-07
  • 1970-01-01
相关资源
最近更新 更多