通过 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"
            }
        }
     }

DestinationViewControllerUITextField 上设置文本在 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"
        }
    }
}