我正在开发一个应用程序,我为该应用程序的每个功能创建了模块。我必须从一个模块 UI 控制器切换到另一个模块 UI 控制器。
我在模块中有 UIController,我将该控制器标记为 Public 访问标识符,如下所示
public class InterAccountTransferViewController: UIViewController {
override public func viewDidLoad() {
......
......
}
}
上面的类还在扩展中实现了 UITextField 委托。当我将上述类创建为开放访问时,我收到有关 TextField 委托的警告,如下所示
实例方法“textFieldDidBeginEditing”几乎匹配可选 协议要求“textFieldDidBeginEditing” 'UITextFieldDelegate'
现在文本字段代表不会被调用。当我尝试通过将代表设置为私有来关闭警告时,他们仍然没有被呼叫。
请让我知道如何消除这些警告并致电代表。
任何想法或建议都很棒。我正在 Xcode 10 和 swift 4.2 上工作。如果我需要进一步解释我的问题,请告诉我。
通过“几乎匹配”,编译器会告诉您两件事:
编译器告诉您存在问题,这很好。这不太好,因为它没有解释问题到底是什么。
问题是你的类比委托方法具有更多的可见性。你的类是
public
,而你的委托方法只是internal
(因为internal
是默认的,如果你没有访问权限)声明中的说明符。)
修复方法是为委托方法提供一个
public
访问说明符。
你必须改变
func textFieldDidBeginEditing(_ textField: UITextField) {
// ...
}
到
public func textFieldDidBeginEditing(_ textField: UITextField) {
// ...
}
这会让编译器知道该方法确实是一个委托方法。
奖励内容...
我如何找到解决方案?我在 Xcode 中重现了该问题。我单击了警告并阅读了修复程序:“使‘textFieldDidBeginEditing’非公开以消除此警告”。我单击“修复”,该行更改为“private func textFieldDidBeginEditing(_ textField: UITextField)”。所以我想也许把它变成
public
而不是 private
会更有帮助。我尝试了一下,检查了一下,它成功了。
为什么 Swift 甚至这样做? 我不确定,但我的猜测是:如果一个类是公共的,但协议方法是内部的,则意味着当您查看时,单个视图控制器对象实现了该协议从模块的角度来看。但由于协议实现是内部的,从外部模块的角度来看,协议方法将不可用,例如来自 UIKit。但这在 Objective C 运行时中是不可能的,即使可能,也会很糟糕。默默地将协议方法公开或半公开是可能的,但不是很干净:例如可以将 textFieldDidBeginEditing 设为内部,但是当您将对象转换为 UITextFieldDelegate 伪对象时,您可以突然调用该方法,这也会令人惊讶。
试试这个
class InterAccountTransferViewController: UIViewController,UITextFieldDelegate {
override func viewDidLoad() {
super.viewDidLoad()
//Attach delegates
self.textfield.delegate = self
}
//TextField Delegate Method
public func textFieldDidBeginEditing(_ textField: UITextField) {
}
}
将您的方法也标记为
public
public func textFieldDidBeginEditing(_ textField: UITextField)
只需在您的函数中添加
public
访问修饰符即可。
public func textFieldDidBeginEditing(_ textField: UITextField) {
// do whatever you want
}
您还可以查看该函数是否已存在于您的 Viewcontroller 中。