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

Ios 如果在viewDidLoad中实例化,UITextFieldDelegate不工作,ios,swift,Ios,Swift,如果我在ViewController中实例化该委托,一切正常,该委托将被正确调用: class ViewController: UIViewController { @IBOutlet weak var topText: UITextField let topDelegate = UpperTextDelegate() override func viewDidLoad() { topText.delegate = topDelegate }

如果我在ViewController中实例化该委托,一切正常,该委托将被正确调用:

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
方法中实例化委托,事情就会中断,委托方法不会被调用

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 = ""
    }   
}

您的代码是否正确构建,因为我认为弱属性必须是可选的(毕竟它可能被设置为nil)

无论如何,弱声明是导致问题的原因

当您声明一个属性时,该类不会保留对它的引用,因此它只有在对象本身的作用域有效时才有效。在第一个示例中,“topDelegate”是在类本身中定义的,因此只要类存在,它就在范围内。在第二个示例中,“topDelegate”是在viewDidLoad方法中定义的,并且它只在该方法存在时才在范围内,这就是为什么viewDidLoad完成后不会调用委托方法的原因


某些东西必须保留“topDelegate”,因此您必须在类中定义它(在这种情况下,为什么不删除弱引用),或者其他东西应该保留它。

您的代码构建是否正确,因为我认为弱属性必须是可选的(毕竟它可能被设置为nil)

无论如何,弱声明是导致问题的原因

当您声明一个属性时,该类不会保留对它的引用,因此它只有在对象本身的作用域有效时才有效。在第一个示例中,“topDelegate”是在类本身中定义的,因此只要类存在,它就在范围内。在第二个示例中,“topDelegate”是在viewDidLoad方法中定义的,并且它只在该方法存在时才在范围内,这就是为什么viewDidLoad完成后不会调用委托方法的原因


有些东西必须保留“topDelegate”,因此您必须在类中定义它(在这种情况下,为什么不删除弱引用),或者其他东西应该保留它。

第二个代码不起作用,因为您没有保留对委托的强引用。您只需实例化UpperTextDelegate对象并将其分配给弱属性。它立即被释放

UITextField的委托属性很弱,因为否则您将始终得到一个保留周期。(您的ViewController保留对其视图的引用->它保留对其子视图(UITextField)的引用->该子视图将保留对其代理(即您的ViewController)的引用。)

如果在类中定义变量(必须是可选的,或者必须在init()中为其赋值),然后在viewDidLoad中为其赋值,则代码将正常工作


我建议在iOS中搜索ARC(自动引用计数)委托模式。

第二个代码不起作用,因为您没有对委托进行强引用。您只需实例化UpperTextDelegate对象并将其分配给弱属性。它立即被释放

UITextField的委托属性很弱,因为否则您将始终得到一个保留周期。(您的ViewController保留对其视图的引用->它保留对其子视图(UITextField)的引用->该子视图将保留对其代理(即您的ViewController)的引用。)

如果在类中定义变量(必须是可选的,或者必须在init()中为其赋值),然后在viewDidLoad中为其赋值,则代码将正常工作


我建议在iOS中搜索ARC(自动引用计数)委托模式

输入UpperTextDelegate()的代码。您确定在设置委托后调用委托方法吗?如果在ViewController的
viewDidLoad
之前调用它,则不会调用
UpperTextDelegate
的委托方法。设置委托后是否确实调用了UpperTextDelegate()的委托方法?如果在ViewController的
viewDidLoad
之前调用,则不会调用
UpperTextDelegate
的委托方法。