【问题标题】:Can I chain delegates together?我可以将代表链接在一起吗?
【发布时间】:2018-03-23 11:13:55
【问题描述】:

Swift 4.0 iOS 11.x

我创建了一个使用 UITextFieldDelegate 的简单文本字段类。我想向它添加一个附加协议,我可以使用它来传递到所述字段的文本输入已完成的事实。一个委托链,因为一旦我发现自定义类中的文本条目已退出这一事实,我似乎无法将其传递给 UITextField 类所在的 VC。

import UIKit

protocol ExitedFieldDelegate {
  func exited(info: String)
}

class IDText: UITextField, UITextFieldDelegate {

  internal var zeus: ExitedFieldDelegate? = nil

  required init(coder aDecoder: NSCoder) {
    super.init(coder: aDecoder)!
    delegate = self
  }

  required override init(frame: CGRect) {
    super.init(frame: frame)
    delegate = self
  }

  func textFieldDidBeginEditing(_ textField: UITextField) {
    self.textColor = UIColor.black
  }

  func textFieldDidEndEditing(_ textField: UITextField, reason: UITextFieldDidEndEditingReason) {
    if (delegate != nil) {
        let info = self.text
        zeus?.exited(info: info!)
    }
  }

}

我将此代码添加到我想在其中使用我的自定义类的 viewController。

class ConfigViewController: UIViewController, ExitedFieldDelegate 

当然还有协议要求的方法

func exited(info: String) {
    print("The brain has left the room")
}

我让它成为上述协议的代表,所以我得到了它的效果

var blah = IDText()
blah.delegate = self

但是它不起作用。我是否在这里尝试不可能的事情,我应该简单地使用默认通知吗?还是别的什么?

【问题讨论】:

  • 请试试这个 blah.zeus = self 并从 zeus 变量中删除 internal。

标签: ios swift delegates swift-protocols


【解决方案1】:

通过设置:

blah.delegate = self

您正在覆盖在初始化程序中将委托设置为self

你想要的是重写:

internal var zeus: ExitedFieldDelegate? = nil

到:

weak var zeus: ExitedFieldDelegate?

为了能够使用weak(您希望这样可以防止保留循环),请将协议定义更新为:

protocol ExitedFieldDelegate: class {
    func exited(info: String)
}

然后改变这个:

var blah = IDText()
blah.delegate = self

到:

var blah = IDText()
// you want to set zeus instead of the delegate field
blah.zeus = self

【讨论】:

  • 请注意,该协议需要class 作为protocol ExitedFieldDelegate: class 才能使weak 成为可能。
猜你喜欢
  • 1970-01-01
  • 2018-10-12
  • 1970-01-01
  • 2011-01-15
  • 1970-01-01
  • 1970-01-01
  • 2019-10-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多