这是我的第一个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模型是如何工作的,并设法在UIView
和ViewController
之间获得一个工作委托模型在这一个似乎返回nil而不是我声明的变量的值。任何线索为什么?上述代码有更“优雅”的方式吗?先感谢您。我正在使用xCode 7.1。
编辑:这是我的故事板。主人是红色,绿色是细节。
没有什么可以包含的,因为这是我的所有代码,我还包括故事板,包含所有的segue及其所拥有的元素。
答案 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,就像查看第二个视图控制器的加载一样,它不会是零。
删除所有“弱”声明,你不需要它们。