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

标签 ios swift

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

相关文章:

json - SwiftUI:尝试加载本地 JSON 数据时,我在 Canvas 中收到预览错误

ios - FireMonkey iOS RAD Studio XE2 - 在从 URL 加载的表单上显示图像

ios - 与所有可能的实体有一个共享按钮 IoS

ios - 在 Xcode 5 中,即使 SDK 目录中有 iOS SDK 6.1,如何使用 iOS SDK 7.0 进行构建?

ios - 刷新表格 View 时应用程序崩溃并出现 fatal error : Index out of range Swift3

ios - 在 swift 3 中保存硬币变量

ios - 重新加载 UITableView 部分时,所有部分都会闪烁

ios - 使用 Swift 代码发布识别应用程序

Swift 通用约束无法转换值

ios - iOS 的自定义控件总是偏移