面对一个nil异常,同时在FirstVC上传递标签文本的属性并将其反映到Label上的SecondVC。
线程1:致命错误:在展开可选值时意外发现nil
https://github.com/marlhex/PasingDataAroundVC
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if segue.identifier == "toSecondSegue" {
// Instance to the next screen
let svc = segue.destination as! SecondVC
// Assigning the same value to the next screen
svc.sameName!.text = self.originalName.text
}
}
有人知道如何相应地传递数据吗?
我知道标签text的属性的默认值将为nil,但是我只是被这个停住了,我知道,令人难以置信
答案 0 :(得分:1)
为什么不使用委托?
protocol firstVCDelegate {
func passingName(_ text: String)
}
class FirstVC: UIViewController {
public weak var delegate: firstVCDelegate?
func goToSecondVC() {
self.delegate?.passingName(futureName.text)
}
}
class SecondVC: UIViewController, firstVCDelegate {
func passingName(_ text: String) {
sameName.text = text
}
}
答案 1 :(得分:1)
在vc加载之前,标签一直为nil,所以
svc.sameName!.text = self.originalName.text
所以使用!会使应用程序崩溃,您需要在目标类中声明一个字符串,例如
@IBOutlet weak var sameName: UILabel!
var str = ""
override func viewDidLoad() {
super.viewDidLoad()
sameName.text = str // assign here
}
然后将其分配给发件人vc prepare
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if segue.identifier == "toSecondSegue" {
// Instance to the next screen
let svc = segue.destination as! SecondVC
// Assigning the same value to the next screen
svc.str = self.originalName.text
}
}
答案 2 :(得分:1)
您正在尝试直接将文本传递给尝试分配该值时未加载到视图中的UILabel
。
您需要将originalName.text
传递到SecondVC中的String
variable
,然后将该值分配给UILabel
中的viewDidLoad
:
SecondVC
var name: String!
@IBOutlet weak var sameName: UILabel!
override func viewDidLoad() {
super.viewDidLoad()
sameName.text = name
}
FirstVC
svc.name = self.originalName.text
答案 3 :(得分:1)
您不能直接从FirstViewController访问子控制器实例。您可以按照以下方式使用String变量来完成此操作。
在SecondViewContorller中声明临时字符串变量,并将其设置为 将值添加到viewDidLoad中的标签控制器,如下所示。
/// Temp string value to set over the controller
var tempValue: String = ""
override func viewDidLoad() {
super.viewDidLoad()
self.sameName.text = self.tempValue
}
希望这可以解决您的问题。