如果我在 ViewController 中实例化委托(delegate),一切正常,委托(delegate)被正确调用:
class ViewController: UIViewController {
@IBOutlet weak var topText: UITextField
let topDelegate = UpperTextDelegate()
override func viewDidLoad() {
topText.delegate = topDelegate
}
// GOOD, DELEGATE METHODS ARE GETTING CALLED AS EXPECTED
如果我在 viewDidLoad
方法内部实例化委托(delegate),事情就会中断,委托(delegate)方法不会被调用。
class ViewController: UIViewController {
@IBOutlet weak var topText: UITextField
override func viewDidLoad() {
topText.delegate = UpperTextDelegate()
}
// BAD, DELEGATE METHODS ARE NOT GETTING CALLED :-(
请问这是怎么回事?
------------
这是代表:
import UIKit
class UpperTextDelegate: NSObject, UITextFieldDelegate {
func textFieldDidBeginEditing(_ textField: UITextField) {
textField.text = ""
}
}
最佳答案
第二个代码不起作用,因为您没有对您的委托(delegate)持有强引用。您只需实例化一个 UpperTextDelegate 对象并将其分配给一个弱属性。它立即被释放。
UITextField 的委托(delegate)属性很弱,否则您总是会得到一个保留周期。 (您的 ViewController 持有对其 View 的引用 -> 它持有对其 subview (UITextField) 的引用 -> 将持有对其委托(delegate)的引用,即你的 ViewController。)
如果您在类中定义变量(必须是可选的,或者您必须在 init() 中为其赋值)然后在 viewDidLoad 中为其赋值,您的代码将起作用。
我建议在 iOS 中搜索 ARC(自动引用计数) 和委托(delegate)模式。
关于ios - 如果在 viewDidLoad 中实例化,UITextFieldDelegate 不工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47054532/