gpt4 book ai didi

ios - 如果在 viewDidLoad 中实例化,UITextFieldDelegate 不工作

转载 作者:行者123 更新时间:2023-11-28 10:48:55 25 4
gpt4 key购买 nike

如果我在 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com