gpt4 book ai didi

ios - 'textFieldDidBeginEditing' 几乎匹配 Swift 中协议(protocol) 'textFieldDidBeginEditing' 的可选要求 'UITextFieldDelegate'

转载 作者:搜寻专家 更新时间:2023-10-31 21:56:03 24 4
gpt4 key购买 nike

我正在开发一个应用程序,我在其中为应用程序的每个功能创建了模块。我必须从一个模块 UI Controller 切换到另一个模块 UI Controller 。

我在模块中有 UIController,我将该 Controller 标记为公共(public)访问标识符,如下所示

public class InterAccountTransferViewController: UIViewController {
override public func viewDidLoad() {
......
......
}
}

上述类还在扩展中实现了 UITextField 委托(delegate)。当我将上面的类创建为开放访问时,我在 TextField 委托(delegate)上收到如下警告

Instance method 'textFieldDidBeginEditing' nearly matches optional requirement 'textFieldDidBeginEditing' of protocol 'UITextFieldDelegate'

enter image description here

现在没有调用文本字段委托(delegate)。当我试图通过将委托(delegate)设为私有(private)来关闭警告时,他们仍然没有被调用。

请让我知道如何消除这些警告并同时调用委托(delegate)。

任何想法或建议都会很棒。我正在使用 swift 4.2 开发 Xcode 10。如果我需要进一步解释我的问题,请告诉我。

最佳答案

对于“几乎匹配”,编译器会告诉您两件事:

  1. 不匹配:方法“textFieldDidBeginEditing(_:)”与委托(delegate)方法“textFieldDidBeginEditing(_:)”不同。这本身对编译器来说不是问题,你只是有一个方法有一些名字,它不知道这个名字,所以没关系。
  2. 非常像委托(delegate)方法“textFieldDidBeginEditing(_:)”。所以编译器可以看到您可能打算将其作为一个委托(delegate)方法,并且它告诉您,好吧,它不起作用。你写的不是委托(delegate)方法。

编译器告诉您存在问题,这很好。它不能很好地解释问题到底是什么。

问题是你的类比委托(delegate)方法更可见。你的类是public,而你的委托(delegate)方法只是internal (因为 internal 是默认值,如果您的声明中没有访问说明符。)

修复方法是为委托(delegate)方法也提供一个 public 访问说明符。

你必须改变

func textFieldDidBeginEditing(_ textField: UITextField) {
// ...
}

public func textFieldDidBeginEditing(_ textField: UITextField) {
// ...
}

这会让编译器知道该方法确实是一个委托(delegate)方法。


奖励内容...

我是如何找到解决方案的?我在 Xcode 中重现了这个问题。我单击警告并阅读 Fixup:“将‘textFieldDidBeginEditing’设为非公开以消除此警告”。我单击“修复”,该行更改为“private func textFieldDidBeginEditing(_ textField: UITextField)”。所以我想也许将它变成 public 而不是 private 会更有帮助。我试了一下,检查了一下,果然有效。

为什么 Swift 甚至要这样做? 我不确定,但我的猜测是:如果一个类是公共(public)的,但协议(protocol)方法是内部的,这意味着一个单独的 View Controller 从模块的角度来看,对象实现了协议(protocol)。但由于协议(protocol)实现是内部的,从外部模块的角度看,协议(protocol)方法将不可用,例如来自 UIKit。但这在 Objective C 运行时是不可能的,即使可能也是不好的。默默地使协议(protocol)方法公开或半公开是可能的,但不是很干净:例如可以将 textFieldDidBeginEditing 设为内部,但是当您将对象转换为 UITextFieldDelegate 伪对象时,您可以突然调用该方法,这同样令人惊讶。

关于ios - 'textFieldDidBeginEditing' 几乎匹配 Swift 中协议(protocol) 'textFieldDidBeginEditing' 的可选要求 'UITextFieldDelegate',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54073680/

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