【问题标题】:Why custom delegate protocol contains an optional value - SWIFT为什么自定义委托协议包含可选值 - SWIFT
【发布时间】:2015-04-11 09:33:21
【问题描述】:

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

    }

}

【问题讨论】:

    标签: ios swift delegates


    【解决方案1】:

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

    var a = BankLoginView(frame : rect)
    

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

    a.delegate1 = BankLogin()
    

    当 viewDidLoad() 完成时 var a 被破坏,因为任何对象都没有保留。

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

     var a = BankLoginView(frame : rect)
    

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

    将 BankLoginView 声明为 IBOutlet 属性:

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

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

    【讨论】:

    • 是的,我已在 niib 文件中将类设置为 BankLoginView ..但也不起作用..我该怎么办?
    • 我在哪里将 BankLoginView 声明为 IBOutlet 属性:?
    • 这里:class BankLogin: UIViewController ,SendMessage{ @IBOutlet weak var bankLoginView: BankLoginView?
    • 我已将 nib 文件分配给查看类,是否可以在 UIViewController 中输出?
    【解决方案2】:

    我注意到与此代码相关的几件事。

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

      @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
    
    
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-03-14
      • 1970-01-01
      • 2019-04-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多