执行 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:如何动态加载图像并将变量传递给第二个视图控制器?
如果条件有效,则转到下一个 ViewController 并传递数据
如何将第二个viewcontroller文本字段值传递给第一个viewcontroller数组并在swift4中点击按钮时关闭