我试图创建一个自定义的委托,它将一个整数值发送到主要的父ViewController类。我建立了一个协议并在父类上实现。可选绑定代码始终显示一个可选值。尽管我已经从UIViewController类设置了委托值,为什么会发生这种情况?

protocol SendMessage{

    func sendViewMessage(Int)
}

class BankLoginView: UIView,UITextFieldDelegate {

    var delegate1 : SendMessage?

   // var accountViewController:UIViewController=AccountLanding()

    override init(frame: CGRect) {

        super.init(frame: frame)

    }

    @IBAction func btnTickAction(sender: AnyObject) {

        if let temp = self.delegate1 {

            delegate1?.sendViewMessage(2)

        }else{

            println("optional value contains nill value")

        }


    }

}

我将委托的值设置为
class BankLogin: UIViewController ,SendMessage{


    override func viewDidLoad() {
        super.viewDidLoad()
        let rect: CGRect = CGRect (x: 0, y :10 , width: self.view.frame.size.width-50, height: self.view.frame.size.height-10)
        var a = BankLoginView(frame : rect)
        a.delegate1 = BankLogin()

    }

}

最佳答案

您正在做的是创建一个新的类BankLoginView的视图

var a = BankLoginView(frame : rect)

它的委托将是一个新的BankLogin实例:
a.delegate1 = BankLogin()

当viewDidLoad()完成时,var被销毁,原因是不保留任何对象。

您可能已在情节提要或nib文件中将BankLogin的视图类设置为BankLoginView,但该视图与您在此行中创建的视图不同:
 var a = BankLoginView(frame : rect)

因此,未分配该委托,它会打印“可选值包含nill值”

将BankLoginView声明为IBOutlet属性:
@IBOutlet weak var bankLoginView: BankLoginView?(确保视图与nib文件链接)

然后在viewDidLoad()中执行:
bankLoginView.delegate1 = self;(您也可以在Interface Builder中执行此操作)

08-26 04:03