执行 segue 时将字符串传递给第二个视图控制器的 UILabel

Posted

技术标签:

【中文标题】执行 segue 时将字符串传递给第二个视图控制器的 UILabel【英文标题】:Passing a string to second view controller's UILabel when performing segue 【发布时间】: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];


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

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

【问题讨论】:

你需要创建一个字符串变量来获取数据并通过。 【参考方案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 并使用您的模型进行更新。 注意这些方面:

    如果您的视图控制器包含在容器视图控制器中,则目标视图控制器是容器视图控制器,因此您需要从中提取视图控制器 在 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..

以上是关于执行 segue 时将字符串传递给第二个视图控制器的 UILabel的主要内容,如果未能解决你的问题,请参考以下文章

无法快速显示第一个视图控制器将值传递给第二个视图控制器

Swift 3:如何动态加载图像并将变量传递给第二个视图控制器?

Swift - 通过 segue 传递值

如果条件有效,则转到下一个 ViewController 并传递数据

在部分视图 MVC5 之间传递视图模型

如何将第二个viewcontroller文本字段值传递给第一个viewcontroller数组并在swift4中点击按钮时关闭