首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在尚未加载的VC上使用委托

问在尚未加载的VC上使用委托
EN

Stack Overflow用户
提问于 2018-12-19 02:54:07
回答 2查看 53关注 0票数 0

我试图做一些我认为很简单的事情,但我一直在努力。我做了很多搜索,但我找不到的正是我想要做的。

我试图将一个字符串从一个VC传递到下一个VC,并使用委托更改其上的标签。我遇到的问题是,由于某种原因,代表以零的身份出现。(我收到此错误:线程1:致命错误:在展开一个可选值时意外地发现为零)下面是我的代码的一些图像,以帮助您理解我所写的东西

第一个VC代码:

代码语言:javascript
复制
    @IBAction func nextBtn(_ sender: Any) {
    let newWorkoutVC = storyboard?.instantiateViewController(withIdentifier: "NewWorkoutVC") as! NewWorkoutVC
    if workoutNameTextField.text != ""{
        let workoutName = workoutNameTextField.text!
        nameDelegate.transferText(name: workoutName) //error appears on this line
        present(newWorkoutVC, animated: true, completion: nil)
    } else {
    }
}

第二,VC具有正在实例化的委托视图,因为它应该在VC即将加载时发生。

代码语言:javascript
复制
override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)

    let workoutNameVC = storyboard?.instantiateViewController(withIdentifier: "WorkoutNameVC") as! WorkoutNameVC
    workoutNameVC.nameDelegate = self

这是我的扩展,使第二个VC符合我的代表。

代码语言:javascript
复制
extension NewWorkoutVC: WorkoutNameDelegate{

func transferText(name: String!) {
    workoutNameLabel.text = name
}
EN

回答 2

Stack Overflow用户

发布于 2018-12-19 03:15:54

您有向后的协议/委托模式。

如果第一VC要实例化并呈现第二VC ( NewWorkoutVC),则不需要“委托”将数据从第一VC移动到第二VC。此刻你说

代码语言:javascript
复制
let newWorkoutVC = storyboard?.instantiateViewController(
                       withIdentifier: "NewWorkoutVC") as! NewWorkoutVC

..。第一VC具有对第二VC的引用,并且可以在呈现它之前立即设置它的任何属性值。

(然而,第一个VC不能试图触摸第二个VC的任何接口。相反,它应该设置一个简单的属性值,让第二个VC获取该属性值并处理它自己的接口,通常是在它自己的viewDidLoad中)。

那么委托/协议模式的目的是什么呢?这是为了防止第二个VC以后需要将信息传回给第一个VC!为了实现这一点,第一个VC还将在我刚才讨论的时候将第二个VC的delegate属性设置为self (即第一个VC),这样第二个VC就知道如何调用第一个VC了。在委托协议模式中:

  • 委托属性(在第二个VC中声明并由第一个VC设置为对self的引用)是第二个VC如何知道其委托是谁的。
  • 由第二个VC定义并由第一个VC采用的协议是第二个VC如何知道它可以对其委托说什么的。
票数 1
EN

Stack Overflow用户

发布于 2018-12-19 03:13:18

要将数据传递给要呈现的视图控制器,不使用委托。当您希望将数据从VC A传递给呈现A的VC时,通常使用委托。

在这里,您可以直接设置属性,因为您已经获得了实例(newWorkoutVC):

代码语言:javascript
复制
let newWorkoutVC = storyboard?.instantiateViewController(withIdentifier: "NewWorkoutVC") as! NewWorkoutVC
if workoutNameTextField.text != ""{
    let workoutName = workoutNameTextField.text!
    newWorkoutVC.workoutName = workoutName
    present(newWorkoutVC, animated: true, completion: nil)
}

其中workoutName在NewWorkoutVC中定义如下:

代码语言:javascript
复制
var workoutName: String!
override func viewDidAppear(animated: Bool) {
    super.viewDidAppear(animated: animated)
    workoutNameLabel.text = workoutName
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53843938

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档