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

时间:2015-04-11 09:33:21

标签: ios swift delegates

我正在尝试创建一个自定义委托,它将一个整数值发送到主要的父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()

    }

}

2 个答案:

答案 0 :(得分:1)

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

var a = BankLoginView(frame : rect)

它的代表将是一个新的BankLogin实例:

a.delegate1 = BankLogin()

当viewDidLoad()完成var a被破坏时,原因不会被任何对象保留。

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

 var a = BankLoginView(frame : rect)

因此,代理人没有被分配并且它打印出来"可选值包含nill值"

将BankLoginView声明为IBOutlet属性:

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

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

答案 1 :(得分:1)

我注意到了这个代码的一些事情。

首先,您要展开可选的委托变量。但是然后使用可选变量而不是未包装的变量。我会像这样打电话给代表:

  @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


}