通过 Segue 将文本传递给 TextView
Pass text to TextView via Segue
我正在尝试从其他 ViewController:
向 TextView
传递文本
if (segue.identifier == "HomeToDetails") {
let nav = segue.destination as! UINavigationController
let nextVC = nav.topViewController as! DetailsViewController
nextVC.infoTextView.text = "TESTING"
}
但是它崩溃了:
fatal error: unexpectedly found nil while unwrapping an Optional value
如果值为 nil 而你打开它,那么应用程序会崩溃,你应该使用可选绑定来避免崩溃。
if (segue.identifier == "HomeToDetails") {
if let nav = segue.destination as? UINavigationController { //should use optional binding to avoid crash
if let nextVC = nav.topViewController as? DetailsViewController {
nextVC.infoTextView.text = "TESTING"
}
}
}
检查这个:
if (segue.identifier == "HomeToDetails") {
// get a reference to the second view controller
let secondViewController = segue.destination as! DetailsViewController
// set a variable in the second view controller with the String to pass
secondViewController.infoTextView.text = "TESTING"
}
试试这个代码:
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
if let nav = segue.destination as? UINavigationController {
if let nextVC = nav.topViewController as? DetailsViewController {
nextVC.infoTextView.text = "Data you want to pass"
}
}
}
在 DestinationViewController
的 UITextField
上设置文本在 prepareForSegue:sender
中是不可能的,因为最近分配的控制器的所有视图组件在加载视图之前都没有初始化(此时时间,它们都是零),它们只会在加载 DestinationViewController
视图时出现。
您需要在 DetailsViewController
中使用可选变量 infoString
,您可以在 prepareForSegue
方法中设置
if (segue.identifier == "HomeToDetails") {
let nav = segue.destination as! UINavigationController
let nextVC = nav.topViewController as! DetailsViewController
nextVC.infoString = "TESTING"
}
在DetailsViewController.swift
class DetailViewController: UIViewController {
var infoString: String?
override func viewDidLoad() {
super.viewDidLoad()
if let info = infoString {
self.infoTextView.text = info
}
}
}
这是因为当您为文本视图赋值时,当时尚未初始化的文本视图作为下一个 class 的 viewDidLoad 尚未调用。所以只传递字符串,然后在下一个class的viewDidLoad中,设置文本。
在创建文本之前,您不能将文本直接传递给另一个视图中的 TextView
。
第一个ViewController:
if (segue.identifier == "HomeToDetails") {
let secondViewController = segue.destination as! DetailsViewController
secondViewController.myText = "TESTING"
}
详情ViewController:
var myText = ""
override func viewDidLoad() {
super.viewDidLoad()
infoTextView.text = myText
}
在加载视图之前,DetailsViewController 的所有视图组件都没有初始化。您可以在为该视图的组件赋值之前加载该视图
考虑 vC 是包含您要加载的视图的视图控制器。然后
if let _ = vC.view {
//Assign value here
}
加载视图后,我们可以为该视图中的组件设置值。在SWIFT 3
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if segue.identifier == "HomeToDetails" {
let nav = segue.destination as! UINavigationController
let nextVC = nav.topViewController as! DetailsViewController
if let _ = nextVC.view {
nextVC.infoTextView.text = "TESTING"
}
}
}
我正在尝试从其他 ViewController:
向TextView
传递文本
if (segue.identifier == "HomeToDetails") {
let nav = segue.destination as! UINavigationController
let nextVC = nav.topViewController as! DetailsViewController
nextVC.infoTextView.text = "TESTING"
}
但是它崩溃了:
fatal error: unexpectedly found nil while unwrapping an Optional value
如果值为 nil 而你打开它,那么应用程序会崩溃,你应该使用可选绑定来避免崩溃。
if (segue.identifier == "HomeToDetails") {
if let nav = segue.destination as? UINavigationController { //should use optional binding to avoid crash
if let nextVC = nav.topViewController as? DetailsViewController {
nextVC.infoTextView.text = "TESTING"
}
}
}
检查这个:
if (segue.identifier == "HomeToDetails") {
// get a reference to the second view controller
let secondViewController = segue.destination as! DetailsViewController
// set a variable in the second view controller with the String to pass
secondViewController.infoTextView.text = "TESTING"
}
试试这个代码:
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
if let nav = segue.destination as? UINavigationController {
if let nextVC = nav.topViewController as? DetailsViewController {
nextVC.infoTextView.text = "Data you want to pass"
}
}
}
在 DestinationViewController
的 UITextField
上设置文本在 prepareForSegue:sender
中是不可能的,因为最近分配的控制器的所有视图组件在加载视图之前都没有初始化(此时时间,它们都是零),它们只会在加载 DestinationViewController
视图时出现。
您需要在 DetailsViewController
中使用可选变量 infoString
,您可以在 prepareForSegue
方法中设置
if (segue.identifier == "HomeToDetails") {
let nav = segue.destination as! UINavigationController
let nextVC = nav.topViewController as! DetailsViewController
nextVC.infoString = "TESTING"
}
在DetailsViewController.swift
class DetailViewController: UIViewController {
var infoString: String?
override func viewDidLoad() {
super.viewDidLoad()
if let info = infoString {
self.infoTextView.text = info
}
}
}
这是因为当您为文本视图赋值时,当时尚未初始化的文本视图作为下一个 class 的 viewDidLoad 尚未调用。所以只传递字符串,然后在下一个class的viewDidLoad中,设置文本。
在创建文本之前,您不能将文本直接传递给另一个视图中的 TextView
。
第一个ViewController:
if (segue.identifier == "HomeToDetails") {
let secondViewController = segue.destination as! DetailsViewController
secondViewController.myText = "TESTING"
}
详情ViewController:
var myText = ""
override func viewDidLoad() {
super.viewDidLoad()
infoTextView.text = myText
}
在加载视图之前,DetailsViewController 的所有视图组件都没有初始化。您可以在为该视图的组件赋值之前加载该视图
考虑 vC 是包含您要加载的视图的视图控制器。然后
if let _ = vC.view {
//Assign value here
}
加载视图后,我们可以为该视图中的组件设置值。在SWIFT 3
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if segue.identifier == "HomeToDetails" {
let nav = segue.destination as! UINavigationController
let nextVC = nav.topViewController as! DetailsViewController
if let _ = nextVC.view {
nextVC.infoTextView.text = "TESTING"
}
}
}