【发布时间】:2016-11-15 13:29:06
【问题描述】:
【问题讨论】:
-
您还没有在 VIEW2 中赋值。在vc2里面你的viewDidLoad试试。 Number1V2.text = labelNumber1
【问题讨论】:
我将textFiled 数据传递给destViewController 以展示segue 在传递数据时的表现。
注意:如果您想将字符串数据传递给您的destVC。您可以分配您的字符串,例如var someValue: String
主线故事板:
MainVC:
@IBOutlet weak var textField: UITextField!
//or you can assign string like var someValue: : String
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
let viewController = segue.destination as! destVC
viewController.dataText = textField.text // someValue.text
}
目标VC:
@IBOutlet var label: UILabel!
var dataText = String()
override func viewDidLoad()
label.text = dataText
}
输出:
【讨论】:
您似乎已经在 ViewController1 和 ViewController2 之间有一个segue,所以现在您只需将一些日期从一个传递到另一个。这可以在从 ViewController1 转换到 ViewController2 时调用的函数 prepare(for segue: UIStoryboardSegue, sender: AnyObject?) 中完成。
UIStoryboardSegue 类有一个名为 source 的属性,其类型为 UIViewController,另一个属性名为 destination,它也是一个 UIViewController。
所以,如果你在 ViewController2 上定义一个属性,像这样:
var labelValue: String
然后您可以在 ViewController1 上定义的 prepareForSegue 中向它传递一个值,如下所示:
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
guard let viewController2 = segue.destination as? YourViewController2 else {
return
}
viewController2.labelValue = theValueFromViewController1
}
Here 是教程告诉你更多(虽然在 Objective C 中)
还有this也是很好的介绍。
希望对你有所帮助。
【讨论】:
我认为您有 ViewController 类 VC1(屏幕 1)和 ViewController 类 VC2(屏幕 2)。我从屏幕截图中看到,您已经在使用 segue 从 VC1 视图转到 VC2 视图。
现在,在你的 VC2 类中声明一个变量,我们称之为 labelValue,
class VC2 {
var labelValue: String?
...
}
每当您使用故事板转场从一个视图控制器的视图移动到另一个视图控制器的视图时,都会使用一个名为的方法,
func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?)
如果它在源 viewController 类中被覆盖(在你的情况下为 scene1),它将被调用。在这种方法中,您将能够访问目标视图控制器(场景 2)及其属性。因此,对于您的情况,您可以像这样实现它,
class VC1 {
//I have assumed the below label will hold the value which you want to pass it to the scene 2.
var lblResult: UILabel!
......
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
// You can access the VC2 instance from the segue
if let vc2 = segue.destinationViewController as? VC2 {
vc2.labelValue = lblResult.text
}
}
现在,一旦如上所示正确实现 prepareForSegue: 方法,您就可以从场景 1 中获取标签的值到场景 2 的 labelValue 属性。
在这里了解更多关于 segues 的信息:More About Segues and Storyboards here.
=================================
编辑:
来到您编辑的问题,在您的 View2 viewController 中,您已将 labelNumber1 声明为 String 而不是 UILabel,因此每当您将值传递给 labelNumber1 时,该值将包含在此变量中,并且不会显示在屏幕,因为它只是一个普通的字符串。所以你可以做的是,将 labelNumber1 声明为 UILabel
class View2: UIViewController {
@IBOutlet var labelNumber1: UILabel!
.....
}
并在 ViewController1 中为 segue 做准备,进行以下更改,
class ViewController1: UIViewController {
.....
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
// You can access the VC2 instance from the segue
if let view2 = segue.destinationViewController as? VC2 {
view2.labelNumber1.text = lblResult.text
}
}
但是,如果您仍想将 labelNumber1 保留为 String,并在 segue 期间验证值是否已从 ViewController1 传递,请在 View2 ViewController 的 viewDidLoad() 中添加以下行。
class View2: UIViewController {
.....
override func viewDidLoad() {
super.viewDidLoad()
print("labelNumber1: \(labelNumber1)")
}
}
并且可以在控制台看到labelNumber1的打印值。
HTH :)
【讨论】: