两个不同的ViewControllers之间的委派

时间:2015-11-08 06:27:21

标签: ios swift swift2

这是我的第一个ViewController

import UIKit

@IBDesignable
class FirstViewController: UIViewController, someProtocol
{
    weak var theCtrl = SecondaryViewController()
    var changer = "test"


    override func viewDidLoad()
    {
        theCtrl?.chng = self
    }


}

这是我的第二个,包括协议声明:

import UIKit


protocol someProtocol : class
{
    var changer:String{get}
}

@IBDesignable
class SecondaryViewController: UIViewController
{
    weak var chng : someProtocol?


    @IBOutlet weak var lbl: UILabel!
        {
            didSet
            {
                print(chng?.changer)
            }

        }

    }

我想要实现的是将FirstViewController中声明的变量传递给SecondaryViewController。虽然我如何使用这两个viewControllers之间的引用来实现这一点,但知道MVC模型是如何工作的,并设法在UIViewViewController之间获得一个工作委托模型在这一个似乎返回nil而不是我声明的变量的值。任何线索为什么?上述代码有更“优雅”的方式吗?先感谢您。我正在使用xCode 7.1。

编辑:这是我的故事板。主人是红色,绿色是细节。

storyboard

没有什么可以包含的,因为这是我的所有代码,我还包括故事板,包含所有的segue及其所拥有的元素。

2 个答案:

答案 0 :(得分:0)

在您的情况下工作就足以删除weak var theCtrl。{/ p>

来自文档:

  

当实例出现时,ARC自动将弱引用设置为nil   它指的是被解除分配。

在初始化SecondaryViewController对象后,没有一个strong引用它,theCtrl对象被解除分配并设置为nil。这就是为什么在这行代码theCtrl?.chng = self中你有nil

如果您只想将changer值设置为SecondaryViewController,最好将其设置为init方法。您的方案非常纠结代码

在这种情况下,问题还在于您在theCtrl内创建了一个对象FirstViewController,但在转换期间,创建了SecondViewController的新对象,并且此对象没有委托,您将委托设置为使用theCtrl = SecondaryViewController()创建的其他对象。您不需要创建SecondViewController direct,而是从prepareForSegue方法中的storyboard获取指向已创建对象的链接,例如:

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { 
    if let identifier = segue.identifier { 
        switch identifier { 
        case "SIDSecond": 
            theCtrl = segue.destinationViewController as! SecondViewController 
            theCtrl?.chng = self 

        default: 
            break 
        } 
    } 
}

但首先您需要将Storyboard Segue Identifire设置为SIDSecond,例如

答案 1 :(得分:0)

在第二个视图控制器的init之后调用didSet,但是在视图加载了第一个viewcontroller之后,就是全部。你不能以这种方式在iboutlet上使用didSet。

稍后检查chng?.changer,就像查看第二个视图控制器的加载一样,它不会是零。

删除所有“弱”声明,你不需要它们。