在这种情况下如何使用协议来更改我以编程方式添加的uiview中的变量?

时间:2016-09-22 23:48:44

标签: swift delegates protocols

我确信我错过了一些非常愚蠢的东西,我总是可以做类似这样的事情,但这次似乎不是。

我有两个类,第一个类是UIView,变量默认为false。第二个类是一个UIViewController,所以我尝试在第二个类中设置变量,但这不起作用。

我正在尝试使用一个可以简单地返回我想要的协议,如果你能告诉我为什么价值为零,我将不胜感激。基本上我的协议的实施有什么问题?

头等舱:

    protocol  CustomizationDelegate{
    func activateCustomization() -> Bool?
 }

 class FirstClass: UIView, UICollectionViewDelegate, UICollectionViewDataSource , UICollectionViewDelegateFlowLayout{


    var modeDelegate: CustomizationDelegate?



    var myParam = false


//where I try to print my boolean to the console and I get nil 

 override init(frame: CGRect) {
    super.init(frame : CGRect(x: 0, y: 0, width: 200, height: 400))
    //logging to console 
 let test = self.modeDelegate?.activateCustomization()
    print("testing", test )
    self.initialSetup()
}


fun initial setup(){
... initialization 
}

}

然后在第二堂课我做;

import UIKit
import Firebase

//implementing the protocol 
class SecondClass: UIViewController, CustomizationDelegate  {


// the first class  
lazy var customclass: FirstClass = {
    let dv = FirstClass()

    //I tried setting it true here 
    dv.myParam = true   

    return dv
}()


func activateCustomization() -> Bool? {
        return true
    }

override func viewDidLoad() {
    super.viewDidLoad()

//setting the delegate to self 
 calendarDayView.modeDelegate = self

 firstClass.frame = CGRect(x: 0, y: 40, width: srvceSetupWindow.frame.width, height: srvceSetupWindow.frame.height-80)

//adding fist class as a subview; seems fine except that myParam is still the default ; false 
 self.addSubview(calendarDayView)


enter code here
...other codes 
}
}

我在SO中看过建议,首先如果是亲子关系我可以使用简单的父母!检查以获得相同的实例,但似乎我不能,因为第一类是UIView而不是控制器。

此外,我已经看到了实施协议的建议,因为我正在努力做到这似乎我错过了一些东西。感谢任何评论。感谢。

1 个答案:

答案 0 :(得分:0)

您在这里使用了很多变量而没有他们实例化的地方。请发布所有相关代码,而不仅仅是代码段:)您使用calendarDayViewfirstClass,但只声明customClass,因此无法知道&# 39;继续他们。

我看到的一个问题是尝试解决此问题:print("testing", test )可以正常工作。

您好像在这里创建视图:

lazy var customclass: FirstClass = {
    let dv = FirstClass()

    //I tried setting it true here 
    dv.myParam = true   

    return dv
}

但是你永远不会设置代理,并且考虑到你试图在构造函数中打印activateCustomization的结果,代理人除非它有一个值,否则它是不可能的。先前在初始化程序中设置。

你是否有可能将其添加到didSet中的类框架中?