Ios 为什么自定义委托协议包含可选值-SWIFT

Ios 为什么自定义委托协议包含可选值-SWIFT,ios,swift,delegates,Ios,Swift,Delegates,我正在尝试创建一个自定义的委托,它向主父级ViewController类发送一个整数值。我建立了一个协议并在父类上实现。可选绑定代码始终显示可选值。虽然我已经从UIViewController类中设置了委托值,但为什么会发生这种情况 我将delegate的值设置为 class BankLogin: UIViewController ,SendMessage{ override func viewDidLoad() { super.viewDidLoad()

我正在尝试创建一个自定义的委托,它向主父级ViewController类发送一个整数值。我建立了一个协议并在父类上实现。可选绑定代码始终显示可选值。虽然我已经从UIViewController类中设置了委托值,但为什么会发生这种情况

我将delegate的值设置为

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()完成时,变量a被销毁,原因不会与任何对象一起保留

可能在故事板或nib文件中,您已将BankLogin的视图类设置为BankLoginView,但该视图与您在此行中创建的视图不同:

 var a = BankLoginView(frame : rect)
因此,委托不会被分配,它会打印“可选值包含nill值”

将BankLoginView声明为IBOutlet属性:

@IBOutlet弱var bankLoginView:bankLoginView?
(确保视图与nib文件链接)

然后在viewDidLoad()中执行:

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

我注意到关于此代码的一些事情

首先,展开可选的委托变量。然后使用可选变量而不是未包装的变量。我会这样称呼代表:

  @IBAction func btnTickAction(sender: AnyObject) {

    if let actualDelegate = self.delegate1 {
        actualDelegate.sendViewMessage(2)

    }else{

        println("optional value contains nill value")

    }
其次,看起来您正在创建BankLogin视图控制器的新实例,并将其设置为代理

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)

    //Do you want to create a new instance of Bank login here?
    //a.delegate1 = BankLogin() 

    // Perhaps should be 
    a.delegate1 = self


}

是的,我已经在niib文件中将类设置为BankLoginView..但也不起作用..我应该怎么做?我在哪里将BankLoginView声明为IBOutlet属性:?这里:class BankLogin:UIViewController,SendMessage{@IBOutlet弱var BankLoginView:BankLoginView?我已经将nib文件分配给view类,是否可以在UIViewController中导出?
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)

    //Do you want to create a new instance of Bank login here?
    //a.delegate1 = BankLogin() 

    // Perhaps should be 
    a.delegate1 = self


}