swift UITextFieldDelegate 扩展

Posted

技术标签:

【中文标题】swift UITextFieldDelegate 扩展【英文标题】:swift UITextFieldDelegate extension 【发布时间】:2019-03-10 12:41:51 【问题描述】:

我是 swift 的新手,我无法理解以下情况。我正在尝试使用几个 UITextFieldDelegate 函数来扩展 UIViewController 类...

class ViewController: UIViewController
    @IBOutlet weak var textField: UITextField!

    override func viewDidLoad() 
        super.viewDidLoad()
        textField.delegate = self

在另一个文件中,如果我定义的函数解包了参数,则函数不会被调用...

extension UIViewController: UITextFieldDelegate

    internal func textFieldShouldBeginEditing(_ textField: UITextField) -> Bool 
        print("Text Field Should Begin Editing called")
        return true
    

但如果我打开参数,它就可以工作了。

    internal func textFieldShouldBeginEditing(_ textField: UITextField!) -> Bool 

你能帮我理解为什么吗? 谢谢

斯威夫特 4.2

【问题讨论】:

【参考方案1】:

因为 Objective-C 不保证一个对象是非 nil 的,所以 Swift 在导入的 Objective-C API 中使参数类型和返回类型中的所有类都是可选的。在使用 Objective-C 对象之前,您应该检查以确保它没有丢失。

如果您使用_ textField: UITextField,则参数可以为空,因此委托不会调用该方法,因为它在方法签名中寻找非空值,即internal func textFieldShouldBeginEditing(_ textField: UITextField!) -> Bool

【讨论】:

【参考方案2】:

在您的扩展文件中,您应该扩展您的 ViewController 类,而不是 UIViewController 类。你不需要解开的力量。所以它应该是这样的:

extension UIViewController: UITextFieldDelegate
    func textFieldShouldBeginEditing(_ textField: UITextField) -> Bool 
         print("Should begin editing!")   
    

【讨论】:

以上是关于swift UITextFieldDelegate 扩展的主要内容,如果未能解决你的问题,请参考以下文章

在 Swift 中创建 UITextFieldDelegate 以限制字符数

键入时如何计算直播的UITextField字数(Swift)?

UIView 的一个类也可以是 UITextFieldDelegate 吗?

高级自动完成 Swift

Swift - UITextField

如何从coredata swift中随机选择一个元素